如何避免在Antlr4中创建寄生lexer规则?
下面的语法不正确 语法如下:如何避免在Antlr4中创建寄生lexer规则?,antlr,antlr4,Antlr,Antlr4,下面的语法不正确 语法如下: program: (keyword | string | WS)*; keyword: 'print'; string: QUOTE (CH | WS)*? QUOTE; QUOTE: '\''; WS : [ \t\r\n]+; CH: .; 目标是让langauge同时具有字符串文本和关键字 解析的字符串如下所示: print 'printed' 它应该被解析为关键字,然后是空格,然后是字符串文字 而是以这种方式进行分析:
program:
(keyword |
string |
WS)*;
keyword: 'print';
string: QUOTE (CH | WS)*? QUOTE;
QUOTE: '\'';
WS : [ \t\r\n]+;
CH: .;
目标是让langauge同时具有字符串文本和关键字
解析的字符串如下所示:
print 'printed'
它应该被解析为关键字,然后是空格,然后是字符串文字
而是以这种方式进行分析:
显然,它在字符串文本中看到关键字print
。这是因为它隐式地为“打印”创建了寄生规则
如何避免/克服这种情况
我不想指定字符串文字可以包含关键字,因为它在逻辑上是不正确的
另外,我不能指定点lexer元运算符,因为我不希望允许引号中包含的每个标记(我不希望引号出现在那里)
那么,该怎么办呢?如果您将组合语法分离为单独的
词法语法
和语法分析器
,ANTLR将不允许您通过语法分析器规则中的文本隐式定义词法规则。如果希望print
成为关键字,则需要包含此lexer规则(否则解析器规则中不允许'print'
):
下一步是将string
从解析器规则转换为lexer规则,如下所示:
STRING : QUOTE ~'\''* QUOTE;
谢谢但是否可以在这里添加转义sequencs,以允许字符串包含引号?
STRING : QUOTE ~'\''* QUOTE;