Antlr4 为什么我的antlr语法会给我一个错误?

Antlr4 为什么我的antlr语法会给我一个错误?,antlr4,Antlr4,我有下面的小语法节点是开始生产的节点。当我的输入是(a:b)时,我得到一个错误:行1:1外部输入'a'应为{':',INAME} 为什么会这样 编辑-我忘记了lexer和parser作为单独的阶段运行。当解析器运行时,lexer已经完成。当lexer运行时,它不知道解析器规则。它已经根据@bart下面的推理做出了类型/INAME选择类型的决定 grammar g1; TYPE: [A-Za-z_]; INAME: [A-Za-z_]; node: '(' namesAndTypes ')';

我有下面的小语法<代码>节点是开始生产的节点。当我的输入是
(a:b)
时,我得到一个错误:
行1:1外部输入'a'应为{':',INAME}

为什么会这样

编辑-我忘记了lexer和parser作为单独的阶段运行。当解析器运行时,lexer已经完成。当lexer运行时,它不知道解析器规则。它已经根据@bart下面的推理做出了类型/INAME选择类型的决定

grammar g1;

TYPE: [A-Za-z_];
INAME: [A-Za-z_];

node: '(' namesAndTypes ')';

namesAndTypes:
               INAME ':' TYPE
             | ':' TYPE
             | INAME
             ;

这是因为lexer永远不会生成
INAME
令牌。lexer在以下方面的工作是:

  • 尽可能多地匹配字符
  • 当两个或多个lexer规则匹配相同字符时,让第一个定义的规则“win”
  • 因为输入的
    “a”
    “b”
    都与
    类型
    INAME
    规则匹配,所以
    类型
    规则获胜,因为它是先定义的。无论解析器是否试图匹配INAME规则,lexer都不会生成它。词法分析器不“听”语法分析器

    您可以创建某种类型的
    ID
    规则,然后定义
    type
    iname
    解析器规则:

    ID: [A-Za-z_];
    
    node
     : '(' namesAndTypes ')'
     ;
    
    namesAndTypes
     : iname ':' type
     | ':' type
     | iname
     ;
    
    type
     : ID
     ;
    
    iname
     : ID
     ;