YACC:可选令牌

YACC: optional token

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

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

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

'{' 是文字字符。以这种方式编写单字符标记是正常的(在 bison 和 flex 中,因为它们需要匹配。)并且您不能使用 | 来表示替代标记,只能替代产生式。所以你需要扩充各种制作:

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