示例#1
0
$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'));