Fix for GitHub issue 11 : Syntax error on operator attributes.
Attributes are allowed to be attached to unary, binary, and ternary operators in expressions. For now just accept and discard them.
This commit is contained in:
parent
be1130ddbf
commit
8135f369a5
168
parse.y
168
parse.y
|
|
@ -2782,66 +2782,66 @@ expression
|
||||||
{ $$ = $1; }
|
{ $$ = $1; }
|
||||||
| inside_expression
|
| inside_expression
|
||||||
{ $$ = $1; }
|
{ $$ = $1; }
|
||||||
| '+' expr_primary %prec UNARY_PREC
|
| '+' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ $$ = $2; }
|
{ $$ = $3; }
|
||||||
| '-' expr_primary %prec UNARY_PREC
|
| '-' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('-', $2);
|
{ PEUnary*tmp = new PEUnary('-', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '~' expr_primary %prec UNARY_PREC
|
| '~' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('~', $2);
|
{ PEUnary*tmp = new PEUnary('~', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '&' expr_primary %prec UNARY_PREC
|
| '&' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('&', $2);
|
{ PEUnary*tmp = new PEUnary('&', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '!' expr_primary %prec UNARY_PREC
|
| '!' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('!', $2);
|
{ PEUnary*tmp = new PEUnary('!', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '|' expr_primary %prec UNARY_PREC
|
| '|' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('|', $2);
|
{ PEUnary*tmp = new PEUnary('|', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '^' expr_primary %prec UNARY_PREC
|
| '^' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('^', $2);
|
{ PEUnary*tmp = new PEUnary('^', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '~' '&' expr_primary %prec UNARY_PREC
|
| '~' '&' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ yyerror(@1, "error: '~' '&' is not a valid expression. "
|
{ yyerror(@1, "error: '~' '&' is not a valid expression. "
|
||||||
"Please use operator '~&' instead.");
|
"Please use operator '~&' instead.");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
| '~' '|' expr_primary %prec UNARY_PREC
|
| '~' '|' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ yyerror(@1, "error: '~' '|' is not a valid expression. "
|
{ yyerror(@1, "error: '~' '|' is not a valid expression. "
|
||||||
"Please use operator '~|' instead.");
|
"Please use operator '~|' instead.");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
| '~' '^' expr_primary %prec UNARY_PREC
|
| '~' '^' attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ yyerror(@1, "error: '~' '^' is not a valid expression. "
|
{ yyerror(@1, "error: '~' '^' is not a valid expression. "
|
||||||
"Please use operator '~^' instead.");
|
"Please use operator '~^' instead.");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
| K_NAND expr_primary %prec UNARY_PREC
|
| K_NAND attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('A', $2);
|
{ PEUnary*tmp = new PEUnary('A', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| K_NOR expr_primary %prec UNARY_PREC
|
| K_NOR attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('N', $2);
|
{ PEUnary*tmp = new PEUnary('N', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| K_NXOR expr_primary %prec UNARY_PREC
|
| K_NXOR attribute_list_opt expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('X', $2);
|
{ PEUnary*tmp = new PEUnary('X', $3);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @3);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '!' error %prec UNARY_PREC
|
| '!' error %prec UNARY_PREC
|
||||||
|
|
@ -2854,133 +2854,133 @@ expression
|
||||||
"is not a primary expression.");
|
"is not a primary expression.");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
| expression '^' expression
|
| expression '^' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('^', $1, $3);
|
{ PEBinary*tmp = new PEBinary('^', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_POW expression
|
| expression K_POW attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBPower('p', $1, $3);
|
{ PEBinary*tmp = new PEBPower('p', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '*' expression
|
| expression '*' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('*', $1, $3);
|
{ PEBinary*tmp = new PEBinary('*', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '/' expression
|
| expression '/' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('/', $1, $3);
|
{ PEBinary*tmp = new PEBinary('/', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '%' expression
|
| expression '%' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('%', $1, $3);
|
{ PEBinary*tmp = new PEBinary('%', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '+' expression
|
| expression '+' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('+', $1, $3);
|
{ PEBinary*tmp = new PEBinary('+', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '-' expression
|
| expression '-' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('-', $1, $3);
|
{ PEBinary*tmp = new PEBinary('-', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '&' expression
|
| expression '&' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('&', $1, $3);
|
{ PEBinary*tmp = new PEBinary('&', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '|' expression
|
| expression '|' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('|', $1, $3);
|
{ PEBinary*tmp = new PEBinary('|', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_NAND expression
|
| expression K_NAND attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('A', $1, $3);
|
{ PEBinary*tmp = new PEBinary('A', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_NOR expression
|
| expression K_NOR attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('O', $1, $3);
|
{ PEBinary*tmp = new PEBinary('O', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_NXOR expression
|
| expression K_NXOR attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBinary('X', $1, $3);
|
{ PEBinary*tmp = new PEBinary('X', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '<' expression
|
| expression '<' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBComp('<', $1, $3);
|
{ PEBinary*tmp = new PEBComp('<', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '>' expression
|
| expression '>' attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBComp('>', $1, $3);
|
{ PEBinary*tmp = new PEBComp('>', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_LS expression
|
| expression K_LS attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBShift('l', $1, $3);
|
{ PEBinary*tmp = new PEBShift('l', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_RS expression
|
| expression K_RS attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBShift('r', $1, $3);
|
{ PEBinary*tmp = new PEBShift('r', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_RSS expression
|
| expression K_RSS attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBShift('R', $1, $3);
|
{ PEBinary*tmp = new PEBShift('R', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_EQ expression
|
| expression K_EQ attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBComp('e', $1, $3);
|
{ PEBinary*tmp = new PEBComp('e', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_CEQ expression
|
| expression K_CEQ attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBComp('E', $1, $3);
|
{ PEBinary*tmp = new PEBComp('E', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_LE expression
|
| expression K_LE attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBComp('L', $1, $3);
|
{ PEBinary*tmp = new PEBComp('L', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_GE expression
|
| expression K_GE attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBComp('G', $1, $3);
|
{ PEBinary*tmp = new PEBComp('G', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_NE expression
|
| expression K_NE attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBComp('n', $1, $3);
|
{ PEBinary*tmp = new PEBComp('n', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_CNE expression
|
| expression K_CNE attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBComp('N', $1, $3);
|
{ PEBinary*tmp = new PEBComp('N', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_LOR expression
|
| expression K_LOR attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBLogic('o', $1, $3);
|
{ PEBinary*tmp = new PEBLogic('o', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression K_LAND expression
|
| expression K_LAND attribute_list_opt expression
|
||||||
{ PEBinary*tmp = new PEBLogic('a', $1, $3);
|
{ PEBinary*tmp = new PEBLogic('a', $1, $4);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| expression '?' expression ':' expression
|
| expression '?' attribute_list_opt expression ':' expression
|
||||||
{ PETernary*tmp = new PETernary($1, $3, $5);
|
{ PETernary*tmp = new PETernary($1, $4, $6);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue