Poison

charPositionInLine

可以使用 {getCharPositionInLine() == 0}? 语义预测来判断当前是否为行首,但是注意该函数实现是基于 \n 换行符的,如果文本中换行使用的 \r,那么使用该方法判定则不会生效,该方法对应的源码位于 LexerATNSimulator.java at 4.9.3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int getCharPositionInLine() {
return charPositionInLine;
}

public void consume(CharStream input) {
int curChar = input.LA(1);
if ( curChar=='\n' ) {
line++;
charPositionInLine=0;
}
else {
charPositionInLine++;
}
input.consume();
}

可以看出,其仅将 \n 视为换行。

Reference

ANTLR4 Lexer Matching Start of Line End Of Line - Stack Overflow