YACC:可选令牌

时间:2016-03-12 16:59:45

标签: token yacc optional

我正在用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应该是可选的。我怎么说'{}'和可选功能之间?

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你应该使用两个规则:

| ID LPAR Expr RPAR
| ID LPAR Expr COMMA Expr RPAR

'{'是一个字面字符。以这种方式编写单字符标记是正常的(在野牛和弹性中都是如此,因为它们需要匹配。)并且您不能使用 | 来表示替代标记,只能使用替代标记。所以你需要扩展各种作品:

| Expr '+' Expr
| Expr '-' Expr
| ID '(' Expr ')'
| ID '(' Expr ',' Expr ')'