Python AnTLR4:缩进和缩进标记
我在AnTLR4中实现Python语法,但我在这里讨论的缩进和DEDENT中面临同样的问题: 我尝试的解决方案是通过在此处找到的Ter转换解决方案(覆盖nextToken并插入假想的令牌) 问题在于,此解决方案假设我们有一个lexer规则,如: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++; }
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
。很抱歉这个无耻的插件,但我也遇到了同样的问题,决定为它编写一个助手类:。