我试图创建一个行首标记:
lexer grammar ScriptLexer;
BOL : {getCharPositionInLine() == 0;}; // Beginning Of Line token
但上面会发出错误
The name 'getCharPositionInLine' does not exist in the current context
因为它创建了这段代码:
private void BOL_action(RuleContext _localctx, int actionIndex) {
switch (actionIndex) {
case 0: getCharPositionInLine() == 0; break;
}
}
getCharPositionInLine()
方法不存在的地方......
答案 0 :(得分:3)
最简单的方法是将EOL识别为相应的BOL令牌。
BC : '/*' .*? '*/' -> channel(HIDDEN) ;
LC : '//' ~[\r\n]* -> channel(HIDDEN) ;
HWS : [ \t]* -> channel(HIDDEN) ;
BOL : [\r\n\f]+ ;
块注释规则之类的规则将在内部使用EOL,因此没有问题。像行注释这样的规则不会消耗EOL,因此将紧接着为该行发出适当的BOL。
潜在的问题是在输入开始时不会发出BOL。处理此问题的最简单方法是在将输入文本提供给词法分析器之前强制为输入文本添加前缀。