如何检测行的开头,或:“当前上下文中不存在名称‘getCharPositionInLine’”

Tar*_*Tar 6 c# antlr4 antlr4cs

我正在尝试创建一个行首标记:

lexer grammar ScriptLexer;

BOL : {getCharPositionInLine() == 0;}; // Beginning Of Line token
Run Code Online (Sandbox Code Playgroud)

但上面发出错误

The name 'getCharPositionInLine' does not exist in the current context
Run Code Online (Sandbox Code Playgroud)

当它创建此代码时:

private void BOL_action(RuleContext _localctx, int actionIndex) {
    switch (actionIndex) {
    case 0: getCharPositionInLine() == 0; break;
    }
}
Run Code Online (Sandbox Code Playgroud)

getCharPositionInLine()方法不存在...

GRo*_*erg 6

最简单的方法是将 EOL 识别为相应的 BOL 令牌。

BC  : '/*' .*? '*/' -> channel(HIDDEN) ;
LC  : '//' ~[\r\n]* -> channel(HIDDEN) ;
HWS : [ \t]*        -> channel(HIDDEN) ;
BOL : [\r\n\f]+ ;
Run Code Online (Sandbox Code Playgroud)

像块注释规则这样的规则会在内部消耗 EOL,所以没有问题。诸如行注释之类的规则不会消耗 EOL,因此将为紧随其后的行发出适当的 BOL。

一个潜在的问题是在输入开始时不会发出 BOL。处理此问题的最简单方法是在将输入文本提供给词法分析器之前,强制使用行终端作为输入文本的前缀。