这是关于另一个关于行首关键字的Stackoverflow问题的解决方案的剩余问题。
我正在为编程语言编写ANTLR4词法分析器和解析器,其中某些东西是关键字,以防它是一行的第一个非空白令牌。让我用一个例子来解释这一点。假设"bla"在以下示例中是关键字:
foo bla
bla foo foo
foo bla bla
第二个"bla"应该被识别为关键字,但其他不应该。
为了实现这一点,我定义了以下简单的ANTLR4语法:grammar foobla;
// PARSER
main
: line* EOF
;
line
: indicator text*
;
indicator
: foo
| bla
;
foo: FOO ;
bla: BLA ;
text: TEXT ;
// LEXER
WHITESPACE: [ t] -> skip ;
fragment NL: [nrf]+[ t]* ;
fragment NONNL: ~[nrf] ;
// Indicators
FOO: NL 'foo' ;
BLA: NL 'bla' ;
TEXT: NONNL+ ;
这类似于如何检测行开始,或者:" the name 'getCharPositionInLine'在当前上下文中不存在"。
现在我的问题是。这工作得很好,除非出现"bla"或";foo"关键字用于输入程序的第一行。我可以想到两种方法来解决这个问题,但我不知道这是如何实现的:- 使用类似BOF(文件开头)令牌的东西。但是,我在手册 中找不到这样的概念。
- 在解析开始之前,使用钩子在输入文件的开头动态添加新行,最好在g4文件本身中指定一些内容。这个我在手册 中都找不到
我不想编写一个额外的应用程序/包装器来为输入文件添加新行。
这是另一个想法:
在BLA
词法分析器规则中添加一个谓词,该谓词检查令牌流的末尾(尚未添加BLA
令牌的地方),以查看最后一个非空白令牌在哪一行。如果该行与当前令牌行不同,则知道BLA
令牌实际上是BLA
令牌,否则将其类型设置为IDENTIIFIER
。