$del = new CombAnd([new S('delete'), 'DEL' => new ListStar($var, $c), $sc]); $jmp = new CombAnd(['JMP' => new Ss(['break', 'continue']), 'LEAP' => new Opt($num), $sc]); $misc = new CombAnd(['MISC' => new Ss(['echo', 'expand', 'throw']), $exp, $sc]); $ret = new Ss(['exit', 'return']); $stat->parser = new CombOr(['BLK' => $blk, $if, $switch, $loop, $do, $try, $del, $jmp, $misc, new CombAnd(['RET' => new Opt($ret), $exp_o, $sc])]); $incdec = new Ss(['++', '--']); $pre = new CombAnd(['PRE' => $incdec, $var]); $param = new CombAnd([$po, 'PARAM' => new OptE(new ListStar(new CombAnd($name_cl_o, $exp), $c)), $pc]); $nat = new CombAnd(['NAT' => $name, $param]); $post = new CombAnd($var, new OptOr(['POST' => $incdec, $param, new CombAnd(new S('->'), $nat)])); $new = new CombAnd([new S('new'), 'NEW' => $var, $param]); $arg_o = new OptAnd($po, new ListStar(new CombAnd(['NAME' => $name, 'EXP' => new OptAnd($cl, $exp)]), $c), $pc); $use_o = new OptAnd(new S('use'), $po, new ListStar(new CombAnd($name_cl_o, $var), $c), $pc); $func = new CombAnd([new S('function'), 'ARG' => $arg_o, 'USE' => $use_o, 'FUNC' => $blk_e, new Opt($param)]); $macro = new CombAnd([new S('macro'), 'MACRO' => $blk_e]); $extends_o = new OptAnd($po, new ListStar($exp, $c), $pc); $member = new Star(new CombAnd(['NAME' => $name, new CombOr(new CombAnd([$cl, 'EXP' => $exp, $sc]), new CombAnd(['ARG' => $arg_o, 'FUNC' => $blk_e]))])); $class = new CombAnd([new S('class'), 'EXTENDS' => $extends_o, $co, 'CLASS' => new OptE($member), $cc]); $const = new Ss(['null', 'true', 'false']); $array = new CombAnd([$bo, 'ARRAY' => new OptE(new ListStar(new CombAnd([new OptAnd(new CombOr(['NUM' => $num, 'STR' => $str, 'NAME' => $name]), $cl), 'EXP' => $exp]), $c)), $bc]); $cast = new CombAnd([new C('<'), 'CAST' => new Ss(['bool', 'int', 'float', 'string', 'array']), new C('>')]); $unary = new CombOr(['UNARY' => new Ss(['+', '-', '~', '!', 'clone']), $cast]); $simple = new Wrap(); $simple->parser = new CombOr([$enc, $pre, $post, $new, $func, $macro, $class, 'CONST' => $const, 'NUM' => $num, 'STR' => $str, $array, $nat, new CombAnd([$unary, 'SIMPLE' => $simple])]); $operands = new Operands($simple, ['MUL' => ['*', '/', '%'], 'ADD' => ['+', '-', '\\'], 'SH' => ['<<', '>>'], 'CMP' => ['<', '>', '<=', '>='], 'EQ' => ['===', '!==', '==', '!=', '=*', '!*', '=~', '!~', '=_', '!_', '=_*', '!_*', '=^', '!^', '=^*', '!^*', '=$', '!$', '=$^', '!$^'], 'AND' => '&', 'XOR' => '^', 'OR' => '|', 'LAND' => '&&', 'LOR' => '||']); $assign = new CombAnd([new Opt($unary), $var, 'ASSIGN' => new Ss(['=', '*=', '/=', '+=', '-=', '\\=', '<<=', '>>=', '&=', '^=', '|=']), 'EXP' => $exp]); $cond = new Wrap(); $cond->parser = new CombAnd(['COND' => $operands, new OptAnd([$q, 'EXPT' => new Opt($operands), $cl, 'EXPF' => $cond])]); $exp->parser = new CombOr($assign, $cond); file_put_contents(__DIR__ . '/parser.php', "<?php\nnamespace Zeyon\\Zpp;\n" . $code->createParser('Parser'));