Flex / bison错误:均已分配'>'和'> ='

问题描述 投票:0回答:1

我在运行代码时遇到问题,这是.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 flex-lexer
1个回答
0
投票

使用撇号的表示法是针对包含单个字符的字符类型。它不是用于字符串。序列>=<=包含两个字符,因此无法使用''表示。在bison manual section on symbols中有更详细的描述。

您可以选择如何解决此问题。您可以为它们使用字符串符号">=""<=",但是手册说明了如何使用%token声明来执行此操作,或者您可以像使用ID一样从词法阶段返回命名的终端。和LITERAL

© www.soinside.com 2019 - 2024. All rights reserved.