我在运行代码时遇到问题,这是.y文件您能告诉我为什么我遇到这个问题吗?
%%
compound_stmt:
'{'stmt_list'}'
;
stmt_list:
stmt stmt_list
|END
;
stmt:
ID '(' expr')'';'
|IF '(' expr')' stmt
|IF '(' expr ')' stmt ELSE stmt
|WHILE '(' expr ')' stmt
|CASE expr ':' stmt
|BREAK ';'
|CONTINUE ';'
|RETURN expr ';'
|loop_stmt ';'
;
expr:
expr '+' term
| expr '-' term
| expr '*' term
| expr '/' term
| term
;
term :
LITERAL
|ID
|'('expr')'
;
loop_stmt:
LOOP '{'stmt_list '}' '[' stmt_list ']' EXIT WHEN condition ';' '[' stmt_list ']' ENDLOOP
;
condition:
comparison
|condition AND comparison
|condition OR comparison
| NOT '('condition')'
;
comparison:
expr comparison_operator expr
;
comparison_operator:
'<'
|'<='
|'='
|'<>'
|'>='
|'>'
;
%%
我得到的错误是:
Test.y:87.10-13:令牌'>'和'> ='都分配了数字62Test.y:84.10-13:令牌'<>'和'<='都分配了数字60Test.y:83.9-11:令牌'<='和'
我如何使它们成为不同的令牌?
使用撇号的表示法是针对包含单个字符的字符类型。它不是用于字符串。序列>=
和<=
包含两个字符,因此无法使用''
表示。在bison manual section on symbols中有更详细的描述。
您可以选择如何解决此问题。您可以为它们使用字符串符号">="
和"<="
,但是手册说明了如何使用%token
声明来执行此操作,或者您可以像使用ID
一样从词法阶段返回命名的终端。和LITERAL
。