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

问题描述

我有下面的小语法。 node 是开始生产。当我的输入是 (a:b) 时,我收到一个错误line 1:1 extraneous input 'a' expecting {':',INAME}

这是为什么?

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

grammar g1;

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

node: '(' namesAndTypes ')';

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

解决方法

那是因为词法分析器永远不会产生 INAME 标记。词法分析器的作用如下:

  1. 尽量匹配尽可能多的字符
  2. 当 2 个或多个词法分析器规则匹配相同的字符时,让第一个定义的“获胜”

因为输入 "a""b" 都匹配 TYPEINAME 规则,TYPE 规则获胜,因为它首先被定义。解析器是否尝试匹配 INAME 规则并不重要,词法分析器不会生成它。词法分析器不会“听”解析器。

您可以创建某种 ID 规则,然后定义 typeiname 解析器规则:

ID: [A-Za-z_];

node
 : '(' namesAndTypes ')'
 ;

namesAndTypes
 : iname ':' type
 | ':' type
 | iname
 ;

type
 : ID
 ;

iname
 : ID
 ;