我正在用lex和yacc创建一个mC编译器,在我的yacc文件中,我想在我的一个表达式中创建和选择令牌。
Expr: Expr ASSIGN|COMMA Expr ;
| Expr AND|OR Expr ;
| Expr EQ|NE|LT|GT|LE|GE Expr ;
| Expr PLUS|MINUS|AST|DIV|MOD Expr ;
| AMP|AST|PLUS|MINUS|NOT Expr ;
| Expr LSQ Expr RSQ ;
| ID LPAR '['Expr '{'COMMA Expr'}'']' RPAR ;
| ID | INTLIT | CHRLIT | STRLIT | LPAR Expr RPAR ;
'{''}表示其可选功能。在此示例中,COMMA Expr应该是可选的。我怎么说'{}'和可选功能之间?
答案 0 :(得分:0)
如果我理解你的问题,你应该使用两个规则:
| ID LPAR Expr RPAR
| ID LPAR Expr COMMA Expr RPAR
'{'
是一个字面字符。以这种方式编写单字符标记是正常的(在野牛和弹性中都是如此,因为它们需要匹配。)并且您不能使用 | 来表示替代标记,只能使用替代标记。所以你需要扩展各种作品:
| Expr '+' Expr
| Expr '-' Expr
| ID '(' Expr ')'
| ID '(' Expr ',' Expr ')'