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.yy
和 src/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._]*;
我正在研究 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.yy
和 src/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._]*;