【问题标题】:How can I differentiate between reserved words and variables using ANTLR?如何使用 ANTLR 区分保留字和变量?
【发布时间】:2012-03-15 19:18:23
【问题描述】:

我正在使用 ANTLR 来标记一个简单的语法,并且需要区分一个 ID:

ID              : LETTER (LETTER | DIGIT)* ;

fragment DIGIT  : '0'..'9' ;
fragment LETTER : 'a'..'z' | 'A'..'Z' ;

还有一个 RESERVED_WORD:

RESERVED_WORD : 'class' | 'public' | 'static' | 'extends' | 'void' | 'int' | 'boolean' | 'if' | 'else' | 'while' | 'return' | 'null' | 'true' | 'false' | 'this' | 'new' | 'String' ;

假设我在输入上运行词法分析器:

class abc

我收到“class”和“abc”的两个 ID 令牌,而我希望将“class”识别为 RESERVED_WORD。我怎样才能做到这一点?

【问题讨论】:

    标签: antlr antlr3


    【解决方案1】:

    只要 2 个(或更多)规则匹配相同数量的字符,第一个定义的规则将“获胜”。所以,如果你在ID 之前定义RESERVED_WORD,像这样:

    RESERVED_WORD : 'class' | 'public' | 'static' | 'extends' | 'void' | 'int' | 'boolean' | 'if' | 'else' | 'while' | 'return' | 'null' | 'true' | 'false' | 'this' | 'new' | 'String' ;
    
    ID              : LETTER (LETTER | DIGIT)* ;
    
    fragment DIGIT  : '0'..'9' ;
    fragment LETTER : 'a'..'z' | 'A'..'Z' ;
    

    输入"class" 将被标记为RESERVED_WORD

    请注意,创建与任何保留字匹配的单个标记没有多大意义:通常是这样完成的:

    // ...
    
    NULL  : 'null';
    TRUE  : 'true';
    FALSE : 'false;
    
    // ...
    
    ID              : LETTER (LETTER | DIGIT)* ;
    
    fragment DIGIT  : '0'..'9' ;
    fragment LETTER : 'a'..'z' | 'A'..'Z' ;
    

    现在"false" 将成为FALSE 令牌,"falser" 将成为ID

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多