Python AnTLR4:缩进和缩进标记

Python AnTLR4:缩进和缩进标记,python,grammar,lexer,antlr4,Python,Grammar,Lexer,Antlr4,我在AnTLR4中实现Python语法,但我在这里讨论的缩进和DEDENT中面临同样的问题: 我尝试的解决方案是通过在此处找到的Ter转换解决方案(覆盖nextToken并插入假想的令牌) 问题在于,此解决方案假设我们有一个lexer规则,如: LEADING_WS : {getColumn()==1}? // match spaces or tabs, tracking indentation count ( ' ' { spaces++; }

我在AnTLR4中实现Python语法,但我在这里讨论的缩进和DEDENT中面临同样的问题:

我尝试的解决方案是通过在此处找到的Ter转换解决方案(覆盖nextToken并插入假想的令牌)

问题在于,此解决方案假设我们有一个lexer规则,如:

LEADING_WS
    :   {getColumn()==1}?
        // match spaces or tabs, tracking indentation count
        (   ' '  { spaces++; }
        |   '\t' { spaces += 8; spaces -= (spaces % 8); }
        |   '\014' // formfeed is ok
        )+
        {
        }
        ...
但我一直得到一个错误,因为lexer规则中的操作必须是单个altermost选项的最后一个元素

有人能帮我找到解决办法吗


非常感谢

您需要将涉及
空格的计算移动到
前导\u WS
规则的末尾或
nextToken
的实现。在
LEADING_WS
的末尾,它可能如下所示

LEADING_WS
  : {getColumn()==1}?
    // match spaces or tabs, tracking indentation count
    [ \t]+
    {spaces = computeSpaces(_input.getText());}
    ;

谢谢你的回复。我正在尝试将其放在nextToken的重写实现上的解决方案!出于好奇,我测试了您提出的解决方案,但我发现$text在lexer操作中是不允许的!我用对了吗?@pinker很抱歉,在ANTLR 4中,你必须使用
\u input.getText()
而不是
$text
。很抱歉这个无耻的插件,但我也遇到了同样的问题,决定为它编写一个助手类:。