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

在ANTLR中捕获格式化变量声明,antlr,grammar,lexer,Antlr,Grammar,Lexer,我有一个简单的lexer/语法,我一直在研究,我很难理解匹配格式化变量的标准操作过程。我正在尝试匹配以下内容: 变量名至少可包含1个字符。如果是一个字符,则必须是大写或小写字母 如果大于1个字符,则必须以任意大小写的字母开头,然后后跟任意数量的字符,包括数字、下划线和美元符号 我已经用多种方式重写了几次,但总是出现以下错误: 决策可以使用多个选项匹配输入,例如“单字母”:1、2 因此,该输入禁用了备选方案2“ 我理解我的语法有一些歧义,但我有点困惑,为什么一旦我们进入最初的匹配循环,就可以匹配多

我有一个简单的lexer/语法,我一直在研究,我很难理解匹配格式化变量的标准操作过程。我正在尝试匹配以下内容:

  • 变量名至少可包含1个字符。如果是一个字符,则必须是大写或小写字母
  • 如果大于1个字符,则必须以任意大小写的字母开头,然后后跟任意数量的字符,包括数字、下划线和美元符号
  • 我已经用多种方式重写了几次,但总是出现以下错误:

    决策可以使用多个选项匹配输入,例如“单字母”: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';
    

    为什么不创建
    VariableName
    ,这是一个为整个名称生成单个标记的lexer规则

    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';
    

    此外,您编写
    变量名
    的方式没有遵循您编写的第2点(语法允许变量以
    开头,但您在解释中不允许这样做).

    非常感谢您的回复。不过,这两个规则似乎与我写的完全相同,只是一个是lexer,一个是解析器规则。“决策可以使用多个选项匹配输入,例如“{a'..'Z','a'..'Z'}”:1,2因此,该输入禁用了选项2”