5

我正在 AnTLR4 中实现 Python 语法,但我遇到了与此处讨论的 INDENT 和 DEDENT 相同的问题:ANTLR4-dynamic injection token

我正在尝试的解决方案是通过 Ter 转换解决方案,可以在此处找到http://antlr3.org/grammar/1078018002577/python.tar.gz(覆盖 nextToken 并插入虚构的令牌)。

问题是这个解决方案假设我们有一个词法分析器规则,如:

LEADING_WS
    :   {getColumn()==1}?
        // match spaces or tabs, tracking indentation count
        (   ' '  { spaces++; }
        |   '\t' { spaces += 8; spaces -= (spaces % 8); }
        |   '\014' // formfeed is ok
        )+
        {
        }
        ...

但我不断收到错误,因为词法分析器规则中的操作必须是单个替代选项中的最后一个元素。

谁能帮我找到解决方案?

非常感谢!!!

4

1 回答 1

3

您需要将涉及的计算移至规则spaces的末尾LEADING_WS或您的nextToken. 最后LEADING_WS它可能如下所示。

LEADING_WS
  : {getColumn()==1}?
    // match spaces or tabs, tracking indentation count
    [ \t]+
    {spaces = computeSpaces(_input.getText());}
    ;
于 2013-08-23T18:56:53.673 回答