version 1.10, 2020/06/10 21:00:01 |
version 1.11, 2020/06/10 21:02:33 |
|
|
%token <i> MATCH NOTMATCH MATCHOP |
%token <i> MATCH NOTMATCH MATCHOP |
%token <i> FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS EMPTYRE |
%token <i> FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS EMPTYRE |
%token <i> AND BOR APPEND EQ GE GT LE LT NE IN |
%token <i> AND BOR APPEND EQ GE GT LE LT NE IN |
%token <i> ARG BLTIN BREAK CLOSE CONTINUE DELETE DO EXIT FOR FUNC |
%token <i> ARG BLTIN BREAK CLOSE CONTINUE DELETE DO EXIT FOR FUNC |
%token <i> SUB GSUB IF INDEX LSUBSTR MATCHFCN NEXT NEXTFILE |
%token <i> SUB GSUB IF INDEX LSUBSTR MATCHFCN NEXT NEXTFILE |
%token <i> ADD MINUS MULT DIVIDE MOD |
%token <i> ADD MINUS MULT DIVIDE MOD |
%token <i> ASSIGN ASGNOP ADDEQ SUBEQ MULTEQ DIVEQ MODEQ POWEQ |
%token <i> ASSIGN ASGNOP ADDEQ SUBEQ MULTEQ DIVEQ MODEQ POWEQ |
|
|
%type <i> do st |
%type <i> do st |
%type <i> pst opt_pst lbrace rbrace rparen comma nl opt_nl and bor |
%type <i> pst opt_pst lbrace rbrace rparen comma nl opt_nl and bor |
%type <i> subop print |
%type <i> subop print |
|
%type <cp> string |
|
|
%right ASGNOP |
%right ASGNOP |
%right '?' |
%right '?' |
|
|
%left AND |
%left AND |
%left GETLINE |
%left GETLINE |
%nonassoc APPEND EQ GE GT LE LT NE MATCHOP IN '|' |
%nonassoc APPEND EQ GE GT LE LT NE MATCHOP IN '|' |
%left ARG BLTIN BREAK CALL CLOSE CONTINUE DELETE DO EXIT FOR FUNC |
%left ARG BLTIN BREAK CALL CLOSE CONTINUE DELETE DO EXIT FOR FUNC |
%left GSUB IF INDEX LSUBSTR MATCHFCN NEXT NUMBER |
%left GSUB IF INDEX LSUBSTR MATCHFCN NEXT NUMBER |
%left PRINT PRINTF RETURN SPLIT SPRINTF STRING SUB SUBSTR |
%left PRINT PRINTF RETURN SPLIT SPRINTF STRING SUB SUBSTR |
%left REGEXPR VAR VARNF IVAR WHILE '(' |
%left REGEXPR VAR VARNF IVAR WHILE '(' |
|
|
$$ = op3($2, (Node *)1, $1, $3); } |
$$ = op3($2, (Node *)1, $1, $3); } |
| pattern IN varname { $$ = op2(INTEST, $1, makearr($3)); } |
| pattern IN varname { $$ = op2(INTEST, $1, makearr($3)); } |
| '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); } |
| '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); } |
| pattern '|' GETLINE var { |
| pattern '|' GETLINE var { |
if (safe) SYNTAX("cmd | getline is unsafe"); |
if (safe) SYNTAX("cmd | getline is unsafe"); |
else $$ = op3(GETLINE, $4, itonp($2), $1); } |
else $$ = op3(GETLINE, $4, itonp($2), $1); } |
| pattern '|' GETLINE { |
| pattern '|' GETLINE { |
if (safe) SYNTAX("cmd | getline is unsafe"); |
if (safe) SYNTAX("cmd | getline is unsafe"); |
else $$ = op3(GETLINE, (Node*)0, itonp($2), $1); } |
else $$ = op3(GETLINE, (Node*)0, itonp($2), $1); } |
| pattern term %prec CAT { $$ = op2(CAT, $1, $2); } |
| pattern term %prec CAT { $$ = op2(CAT, $1, $2); } |
|
|
; |
; |
|
|
simple_stmt: |
simple_stmt: |
print prarg '|' term { |
print prarg '|' term { |
if (safe) SYNTAX("print | is unsafe"); |
if (safe) SYNTAX("print | is unsafe"); |
else $$ = stat3($1, $2, itonp($3), $4); } |
else $$ = stat3($1, $2, itonp($3), $4); } |
| print prarg APPEND term { |
| print prarg APPEND term { |
|
|
SUB | GSUB |
SUB | GSUB |
; |
; |
|
|
|
string: |
|
STRING |
|
| string STRING { $$ = catstr($1, $2); } |
|
; |
|
|
term: |
term: |
term '/' ASGNOP term { $$ = op2(DIVEQ, $1, $4); } |
term '/' ASGNOP term { $$ = op2(DIVEQ, $1, $4); } |
| term '+' term { $$ = op2(ADD, $1, $3); } |
| term '+' term { $$ = op2(ADD, $1, $3); } |
|
|
| SPLIT '(' pattern comma varname ')' |
| SPLIT '(' pattern comma varname ')' |
{ $$ = op4(SPLIT, $3, makearr($5), NIL, (Node*)STRING); } /* default */ |
{ $$ = op4(SPLIT, $3, makearr($5), NIL, (Node*)STRING); } /* default */ |
| SPRINTF '(' patlist ')' { $$ = op1($1, $3); } |
| SPRINTF '(' patlist ')' { $$ = op1($1, $3); } |
| STRING { $$ = celltonode($1, CCON); } |
| string { $$ = celltonode($1, CCON); } |
| subop '(' reg_expr comma pattern ')' |
| subop '(' reg_expr comma pattern ')' |
{ $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, rectonode()); } |
{ $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, rectonode()); } |
| subop '(' pattern comma pattern ')' |
| subop '(' pattern comma pattern ')' |
|
|
| varname '[' patlist ']' { $$ = op2(ARRAY, makearr($1), $3); } |
| varname '[' patlist ']' { $$ = op2(ARRAY, makearr($1), $3); } |
| IVAR { $$ = op1(INDIRECT, celltonode($1, CVAR)); } |
| IVAR { $$ = op1(INDIRECT, celltonode($1, CVAR)); } |
| INDIRECT term { $$ = op1(INDIRECT, $2); } |
| INDIRECT term { $$ = op1(INDIRECT, $2); } |
; |
; |
|
|
varlist: |
varlist: |
/* nothing */ { arglist = $$ = 0; } |
/* nothing */ { arglist = $$ = 0; } |