在ANTLR中捕获格式化的变量声明

时间:2013-09-09 23:59:41

标签: antlr grammar lexer

我有一个简单的词法分析器/语法我一直在努力,我无法理解匹配格式化变量的标准操作过程。我想尝试匹配以下内容:

  1. 变量名最少可以是1个字符。如果它是一个字符,则必须是大写或小写字母。
  2. 如果大于1个字符,则必须以任何字母开头,然后跟随任意数量的字符,包括数字,下划线和美元符号。
  3. 我已经多次重写过这种方式,并且总是会出现以下错误:

      

    决策可以使用多种选择匹配输入,例如“SINGLELETTER”:1,2

         

    结果,对于该输入“

    ,禁用了备选方案2

    非常感谢一些见解。我理解我的语法有些含糊不清,但是一旦我们进入原始的匹配循环,我有点困惑为什么可以匹配多个替代品。谢谢!

    variablename 
        :   (SINGLELETTER)
        |   (SINGLELETTER|UNDERSCORE)( SINGLELETTER|UNDERSCORE | DOLLAR | NUMBER)*;
    
    SINGLELETTER    :   ( 'a'..'z' | 'A'..'Z');
    
    
    fragment LOWERCASE  :   'a'..'z';
    fragment UNDERSCORE :   '_';
    fragment DOLLAR :   '$';  
    fragment NUMBER :   '0'..'9';
    

1 个答案:

答案 0 :(得分:0)

为什么不制作VariableName,一个为整个名称生成单个标记的词法分析器规则?

Variablename 
    :   SINGLELETTER
    |   (SINGLELETTER|UNDERSCORE) (SINGLELETTER | UNDERSCORE | DOLLAR | NUMBER)*;

fragment SINGLELETTER   :   ( 'a'..'z' | 'A'..'Z');


fragment LOWERCASE  :   'a'..'z';
fragment UNDERSCORE :   '_';
fragment DOLLAR :   '$';  
fragment NUMBER :   '0'..'9';

此外,您编写variableName的方式并不遵循您编写的第2点(语法允许变量以_开头,但您在解释中并未允许这样做。)< / p>