ANTLR:带有尾随括号的不同令牌

ANTLR: Different token with trailing bracket

我正在研究 BUGS - my repo is here 的 ANTLRv4 语法,link 指向一个特定的提交,所以不应该过时。

下面是最简单的代码示例。

如果输入是 T(,我希望输入规则沿着 t 路线走,但是如果输入是 T,我希望输入规则沿着 id 路线走下面的语法。

grammar temp;

input: t | id;
t: T '(';
id: ID;

T: 'T' {_input.LA(1)==(}?;

ID: [a-zA-Z][a-zA-Z0-9._]*;

我的 BUGS 语法的 ANLTRv4 规范在很大程度上受到 JAGS 4.3.0 source code 中包含的 FLEX+BISON 词法分析和解析语法的启发,在文件 src/lib/compiler/parser.yysrc/lib/compiler/scanner.ll.[=27= 中]

他们完成它的方法是在词法分析器中使用尾随上下文,例如r/s。给出了在 ANTLR 中执行此操作的方法 here,但我无法使其工作。

我需要它以这种方式工作,因为语法的另一部分依赖于这种机制 - 相关代码片段 here

您可以通过克隆 my repo 和 运行 make 来重新创建我的特定问题 - 这将在解析阶段给出词法分析和错误的标记列表。在标记列表中,字母 T 被词法化为标记 'T' 而不是我希望的 ID

我觉得在 ANTLR 中有更多 natural/correct 的方法,但我是新手,想不出办法。

PS 如果您知道如何更好地命名这个问题,请编辑它。

如果我正确理解问题,则以下代码可以正常工作:

grammar temp;

input: t | id;
t:     T '(';
id:    ID | T;

T:      'T';
LPAREN: '(';
ID: [a-zA-Z][a-zA-Z0-9._]*;