2016年1月18日月曜日

[yacc] %left, %right, %prec

中間演算子等の再帰方向を指定すると共に、優先度付も行う。

%left ID_OPERATOR_LOGICAL_OR
%left ID_OPERATOR_LOGICAL_AND
%left '|'
%left '^'
%left '&'
%left ID_OPERATOR_COMPARE_EQ ID_OPERATOR_COMPARE_NE
%left '>' '<' ID_OPERATOR_COMPARE_LE ID_OPERATOR_COMPARE_GE
%left ID_OPERATOR_LEFT_SHIFT ID_OPERATOR_RIGHT_SHIFT
%left '+' '-'
%left '*' '/' '%'
%left UMINUS

上記は中間オペレータと前置オペレータの優先度を表現している。一番下が優先度が一番高い。
また、中間演算子は全て左再帰になる。

primary_expression : identifier { $$ = new VEAccess(VECode::opAccess, $1); }
                   | '&' identifier { $$ = new VEAccess(VECode::opAddress, $2); }
                   | '-' expression %prec UMINUS { $$ = new VEUnaryExpression(VECode::opUnaryMinus, $2); }
                   | constant
                   | ID_SIZEOF '(' type_declaration ')' { $$ = new VESizeOf($3); }
                   | ID_SIZEOF '(' identifier ')' { $$ = new VESizeOf(); }
                   | '{' expressions '}' { $$ = $2; }
                   | '(' expression ')' { $$ = $2; }
;
また、単項演算子の'-'に関しては%precにより意味付けをする。


0 件のコメント:

コメントを投稿