📄 perly.y
字号:
| sexpr OROR sexpr { $$ = make_op(O_OR, 2, $1, $3, Nullarg); } | sexpr '?' sexpr ':' sexpr { $$ = make_op(O_COND_EXPR, 3, $1, $3, $5); } | sexpr MATCH sexpr { $$ = mod_match(O_MATCH, $1, $3); } | sexpr NMATCH sexpr { $$ = mod_match(O_NMATCH, $1, $3); } | term { $$ = $1; } ;term : '-' term %prec UMINUS { $$ = make_op(O_NEGATE, 1, $2, Nullarg, Nullarg); } | '+' term %prec UMINUS { $$ = $2; } | '!' term { $$ = make_op(O_NOT, 1, $2, Nullarg, Nullarg); } | '~' term { $$ = make_op(O_COMPLEMENT, 1, $2, Nullarg, Nullarg);} | term INC { $$ = addflags(1, AF_POST|AF_UP, l(make_op(O_ITEM,1,$1,Nullarg,Nullarg))); } | term DEC { $$ = addflags(1, AF_POST, l(make_op(O_ITEM,1,$1,Nullarg,Nullarg))); } | INC term { $$ = addflags(1, AF_PRE|AF_UP, l(make_op(O_ITEM,1,$2,Nullarg,Nullarg))); } | DEC term { $$ = addflags(1, AF_PRE, l(make_op(O_ITEM,1,$2,Nullarg,Nullarg))); } | FILETEST WORD { opargs[$1] = 0; /* force it special */ $$ = make_op($1, 1, stab2arg(A_STAB,stabent($2,TRUE)), Nullarg, Nullarg); Safefree($2); $2 = Nullch; } | FILETEST sexpr { opargs[$1] = 1; $$ = make_op($1, 1, $2, Nullarg, Nullarg); } | FILETEST { opargs[$1] = ($1 != O_FTTTY); $$ = make_op($1, 1, stab2arg(A_STAB, $1 == O_FTTTY?stabent("STDIN",TRUE):defstab), Nullarg, Nullarg); } | LOCAL '(' expr crp { $$ = l(localize(make_op(O_ASSIGN, 1, localize(listish(make_list($3))), Nullarg,Nullarg))); } | '(' expr crp { $$ = make_list($2); } | '(' ')' { $$ = make_list(Nullarg); } | DO sexpr %prec FILETEST { $$ = make_op(O_DOFILE,2,$2,Nullarg,Nullarg); allstabs = TRUE;} | DO block %prec '(' { $$ = cmd_to_arg($2); } | REG %prec '(' { $$ = stab2arg(A_STAB,$1); } | STAR %prec '(' { $$ = stab2arg(A_STAR,$1); } | REG '[' expr ']' %prec '(' { $$ = make_op(O_AELEM, 2, stab2arg(A_STAB,aadd($1)), $3, Nullarg); } | HSH %prec '(' { $$ = make_op(O_HASH, 1, stab2arg(A_STAB,$1), Nullarg, Nullarg); } | ARY %prec '(' { $$ = make_op(O_ARRAY, 1, stab2arg(A_STAB,$1), Nullarg, Nullarg); } | REG '{' expr ';' '}' %prec '(' { $$ = make_op(O_HELEM, 2, stab2arg(A_STAB,hadd($1)), jmaybe($3), Nullarg); expectterm = FALSE; } | '(' expr crp '[' expr ']' %prec '(' { $$ = make_op(O_LSLICE, 3, Nullarg, listish(make_list($5)), listish(make_list($2))); } | '(' ')' '[' expr ']' %prec '(' { $$ = make_op(O_LSLICE, 3, Nullarg, listish(make_list($4)), Nullarg); } | ARY '[' expr ']' %prec '(' { $$ = make_op(O_ASLICE, 2, stab2arg(A_STAB,aadd($1)), listish(make_list($3)), Nullarg); } | ARY '{' expr ';' '}' %prec '(' { $$ = make_op(O_HSLICE, 2, stab2arg(A_STAB,hadd($1)), listish(make_list($3)), Nullarg); expectterm = FALSE; } | DELETE REG '{' expr ';' '}' %prec '(' { $$ = make_op(O_DELETE, 2, stab2arg(A_STAB,hadd($2)), jmaybe($4), Nullarg); expectterm = FALSE; } | DELETE '(' REG '{' expr ';' '}' ')' %prec '(' { $$ = make_op(O_DELETE, 2, stab2arg(A_STAB,hadd($3)), jmaybe($5), Nullarg); expectterm = FALSE; } | ARYLEN %prec '(' { $$ = stab2arg(A_ARYLEN,$1); } | RSTRING %prec '(' { $$ = $1; } | PATTERN %prec '(' { $$ = $1; } | SUBST %prec '(' { $$ = $1; } | TRANS %prec '(' { $$ = $1; } | DO WORD '(' expr crp { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_WORD,stabent($2,MULTI)), make_list($4), Nullarg); Safefree($2); $2 = Nullch; $$->arg_flags |= AF_DEPR; } | AMPER WORD '(' expr crp { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_WORD,stabent($2,MULTI)), make_list($4), Nullarg); Safefree($2); $2 = Nullch; } | DO WORD '(' ')' { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_WORD,stabent($2,MULTI)), make_list(Nullarg), Nullarg); Safefree($2); $2 = Nullch; $$->arg_flags |= AF_DEPR; } | AMPER WORD '(' ')' { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_WORD,stabent($2,MULTI)), make_list(Nullarg), Nullarg); Safefree($2); $2 = Nullch; } | AMPER WORD { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_WORD,stabent($2,MULTI)), Nullarg, Nullarg); Safefree($2); $2 = Nullch; } | DO REG '(' expr crp { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_STAB,$2), make_list($4), Nullarg); $$->arg_flags |= AF_DEPR; } | AMPER REG '(' expr crp { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_STAB,$2), make_list($4), Nullarg); } | DO REG '(' ')' { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_STAB,$2), make_list(Nullarg), Nullarg); $$->arg_flags |= AF_DEPR; } | AMPER REG '(' ')' { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_STAB,$2), make_list(Nullarg), Nullarg); } | AMPER REG { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2, stab2arg(A_STAB,$2), Nullarg, Nullarg); } | LOOPEX { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); } | LOOPEX WORD { $$ = make_op($1,1,cval_to_arg($2), Nullarg,Nullarg); } | UNIOP { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); } | UNIOP block { $$ = make_op($1,1,cmd_to_arg($2),Nullarg,Nullarg); } | UNIOP sexpr { $$ = make_op($1,1,$2,Nullarg,Nullarg); } | SSELECT { $$ = make_op(O_SELECT, 0, Nullarg, Nullarg, Nullarg);} | SSELECT WORD { $$ = make_op(O_SELECT, 1, stab2arg(A_WORD,stabent($2,TRUE)), Nullarg, Nullarg); Safefree($2); $2 = Nullch; } | SSELECT '(' handle ')' { $$ = make_op(O_SELECT, 1, $3, Nullarg, Nullarg); } | SSELECT '(' sexpr csexpr csexpr csexpr ')' { arg4 = $6; $$ = make_op(O_SSELECT, 4, $3, $4, $5); } | OPEN WORD %prec '(' { $$ = make_op(O_OPEN, 2, stab2arg(A_WORD,stabent($2,TRUE)), stab2arg(A_STAB,stabent($2,TRUE)), Nullarg); Safefree($2); $2 = Nullch; } | OPEN '(' WORD ')' { $$ = make_op(O_OPEN, 2, stab2arg(A_WORD,stabent($3,TRUE)), stab2arg(A_STAB,stabent($3,TRUE)), Nullarg); Safefree($3); $3 = Nullch; } | OPEN '(' handle cexpr ')' { $$ = make_op(O_OPEN, 2, $3, $4, Nullarg); } | FILOP '(' handle ')' { $$ = make_op($1, 1, $3, Nullarg, Nullarg); } | FILOP WORD { $$ = make_op($1, 1, stab2arg(A_WORD,stabent($2,TRUE)), Nullarg, Nullarg); Safefree($2); $2 = Nullch; } | FILOP REG { $$ = make_op($1, 1, stab2arg(A_STAB,$2), Nullarg, Nullarg); } | FILOP '(' ')' { $$ = make_op($1, 1, stab2arg(A_WORD,Nullstab), Nullarg, Nullarg); } | FILOP %prec '(' { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); } | FILOP2 '(' handle cexpr ')' { $$ = make_op($1, 2, $3, $4, Nullarg); } | FILOP3 '(' handle csexpr cexpr ')' { $$ = make_op($1, 3, $3, $4, make_list($5)); } | FILOP22 '(' handle ',' handle ')' { $$ = make_op($1, 2, $3, $5, Nullarg); } | FILOP4 '(' handle csexpr csexpr cexpr ')' { arg4 = $6; $$ = make_op($1, 4, $3, $4, $5); } | FILOP25 '(' handle ',' handle csexpr csexpr cexpr ')' { arg4 = $7; arg5 = $8; $$ = make_op($1, 5, $3, $5, $6); } | PUSH '(' aryword ',' expr crp { $$ = make_op($1, 2, $3, make_list($5), Nullarg); } | POP aryword %prec '(' { $$ = make_op(O_POP, 1, $2, Nullarg, Nullarg); } | POP '(' aryword ')' { $$ = make_op(O_POP, 1, $3, Nullarg, Nullarg); } | SHIFT aryword %prec '(' { $$ = make_op(O_SHIFT, 1, $2, Nullarg, Nullarg); } | SHIFT '(' aryword ')' { $$ = make_op(O_SHIFT, 1, $3, Nullarg, Nullarg); } | SHIFT %prec '(' { $$ = make_op(O_SHIFT, 1, stab2arg(A_STAB, aadd(stabent(subline ? "_" : "ARGV", TRUE))), Nullarg, Nullarg); } | SPLIT %prec '(' { static char p[]="/\\s+/"; char *oldend = bufend; ARG *oldarg = yylval.arg; bufend=p+5; (void)scanpat(p); bufend=oldend; $$ = make_split(defstab,yylval.arg,Nullarg); yylval.arg = oldarg; } | SPLIT '(' sexpr csexpr csexpr ')' { $$ = mod_match(O_MATCH, $4, make_split(defstab,$3,$5));} | SPLIT '(' sexpr csexpr ')' { $$ = mod_match(O_MATCH, $4, make_split(defstab,$3,Nullarg) ); } | SPLIT '(' sexpr ')' { $$ = mod_match(O_MATCH, stab2arg(A_STAB,defstab), make_split(defstab,$3,Nullarg) ); } | FLIST2 '(' sexpr cexpr ')' { $$ = make_op($1, 2, $3, listish(make_list($4)), Nullarg); } | FLIST '(' expr crp { $$ = make_op($1, 1, make_list($3), Nullarg, Nullarg); } | LVALFUN sexpr %prec '(' { $$ = l(make_op($1, 1, fixl($1,$2), Nullarg, Nullarg)); } | LVALFUN { $$ = l(make_op($1, 1, stab2arg(A_STAB,defstab), Nullarg, Nullarg)); } | FUNC0 { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); } | FUNC0 '(' ')' { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); } | FUNC1 '(' ')' { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); } | FUNC1 '(' expr ')' { $$ = make_op($1, 1, $3, Nullarg, Nullarg); } | FUNC2 '(' sexpr cexpr ')' { $$ = make_op($1, 2, $3, $4, Nullarg); if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE) fbmcompile($$[2].arg_ptr.arg_str,0); } | FUNC2x '(' sexpr csexpr ')' { $$ = make_op($1, 2, $3, $4, Nullarg); if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE) fbmcompile($$[2].arg_ptr.arg_str,0); } | FUNC2x '(' sexpr csexpr cexpr ')' { $$ = make_op($1, 3, $3, $4, $5); if ($1 == O_INDEX && $$[2].arg_type == A_SINGLE) fbmcompile($$[2].arg_ptr.arg_str,0); } | FUNC3 '(' sexpr csexpr cexpr ')' { $$ = make_op($1, 3, $3, $4, $5); } | FUNC4 '(' sexpr csexpr csexpr cexpr ')' { arg4 = $6; $$ = make_op($1, 4, $3, $4, $5); } | FUNC5 '(' sexpr csexpr csexpr csexpr cexpr ')' { arg4 = $6; arg5 = $7; $$ = make_op($1, 5, $3, $4, $5); } | HSHFUN '(' hshword ')' { $$ = make_op($1, 1, $3, Nullarg, Nullarg); } | HSHFUN hshword { $$ = make_op($1, 1, $2, Nullarg, Nullarg); } | HSHFUN3 '(' hshword csexpr cexpr ')' { $$ = make_op($1, 3, $3, $4, $5); } | bareword | listop ;listop : LISTOP { $$ = make_op($1,2, stab2arg(A_WORD,Nullstab), stab2arg(A_STAB,defstab), Nullarg); } | LISTOP expr { $$ = make_op($1,2, stab2arg(A_WORD,Nullstab), maybelistish($1,make_list($2)), Nullarg); } | LISTOP WORD { $$ = make_op($1,2, stab2arg(A_WORD,stabent($2,TRUE)), stab2arg(A_STAB,defstab), Nullarg); Safefree($2); $2 = Nullch; } | LISTOP WORD expr { $$ = make_op($1,2, stab2arg(A_WORD,stabent($2,TRUE)), maybelistish($1,make_list($3)), Nullarg); Safefree($2); $2 = Nullch; } | LISTOP REG expr { $$ = make_op($1,2, stab2arg(A_STAB,$2), maybelistish($1,make_list($3)), Nullarg); } | LISTOP block expr { $$ = make_op($1,2, cmd_to_arg($2), maybelistish($1,make_list($3)), Nullarg); } ;handle : WORD { $$ = stab2arg(A_WORD,stabent($1,TRUE)); Safefree($1); $1 = Nullch;} | sexpr ;aryword : WORD { $$ = stab2arg(A_WORD,aadd(stabent($1,TRUE))); Safefree($1); $1 = Nullch; } | ARY { $$ = stab2arg(A_STAB,$1); } ;hshword : WORD { $$ = stab2arg(A_WORD,hadd(stabent($1,TRUE))); Safefree($1); $1 = Nullch; } | HSH { $$ = stab2arg(A_STAB,$1); } ;crp : ',' ')' { $$ = 1; } | ')' { $$ = 0; } ;/* * NOTE: The following entry must stay at the end of the file so that * reduce/reduce conflicts resolve to it only if it's the only option. */bareword: WORD { char *s; $$ = op_new(1); $$->arg_type = O_ITEM; $$[1].arg_type = A_SINGLE; $$[1].arg_ptr.arg_str = str_make($1,0); for (s = $1; *s && isLOWER(*s); s++) ; if (dowarn && !*s) warn( "\"%s\" may clash with future reserved word", $1 ); Safefree($1); $1 = Nullch; } ;%% /* PROGRAM */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -