【问题标题】:ANTLR: Different token with trailing bracketANTLR:带有尾括号的不同标记
【发布时间】:2017-07-28 18:09:11
【问题描述】:

我正在为BUGS 编写一个ANTLRv4 语法——我的repo 是here,链接指向一个特定的提交,所以不应该过时。

下面的最小代码示例。

如果输入为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 文件 src/lib/compiler/parser.yysrc/lib/compiler/scanner.ll 中的 FLEX+BISON 词法分析和解析语法的极大启发。

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

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

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

我觉得在 ANTLR 中有更自然/正确的方法可以做到这一点,但我是新手,无法找到方法。

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

【问题讨论】:

    标签: parsing antlr antlr4 flex-lexer lex


    【解决方案1】:

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

    grammar temp;
    
    input: t | id;
    t:     T '(';
    id:    ID | T;
    
    T:      'T';
    LPAREN: '(';
    ID: [a-zA-Z][a-zA-Z0-9._]*;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      相关资源
      最近更新 更多