⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perly.y

📁 早期freebsd实现
💻 Y
📖 第 1 页 / 共 2 页
字号:
	|	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 + -