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 ')'
我正在用 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 ')'