如何在ANTLR语法中指定行首关键字(这也适用于第一个输入行)



这是关于另一个关于行首关键字的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

相关内容

  • 没有找到相关文章