繁体   English   中英

使用lexer语法运行Antlr4解析器会得到令牌识别错误

[英]Running Antlr4 parser with lexer grammar gets token recognition errors

我正在尝试创建一种语法来解析Solr查询(仅适度相关,并且您不需要了解任何有关solr的信息即可回答这个问题-仅仅比我对antlr 4.7的了解还要多)。 我将其基于solr 6中的QueryParser.jj文件。我正在寻找一个现有的文件,但是似乎没有一个不旧且过时的文件。

我被卡住了,因为当我尝试运行解析器时,出现“令牌识别错误”。

我创建的词法分析器使用词法分析器模式,据我了解,这意味着我需要有一个单独的词法分析器语法文件。 所以,我有一个解析器和一个词法分析器文件。

我将其缩减为一个简单的示例,以展示我所看到的。 也许有人可以告诉我我在做什么错。 这是解析器(Junk.g4):

grammar Junk;

options {
  language = Java;
  tokenVocab=JLexer;
}

term : TERM '\r\n'; 

由于尝试创建的lexer文件中的lexer模式,我无法使用导入(如果使用导入,则模式中的标记将变为“未定义”)。 这就是为什么我用tokenVocab参数引用lexer文件的原因(如github中的XML示例所示)。

这是词法分析器(JLexer.g4):

lexer grammar JLexer;

TERM : TERM_START_CHAR TERM_CHAR* ;

TERM_START_CHAR : [abc] ;  
TERM_CHAR : [efg] ; 
WS  : [ \t\n\r\u3000]+ -> skip;

如果我将词法分析器代码复制到解析器中,那么事情将按预期进行(例如,“ aeee”是一个术语)。 另外,如果我使用grun(将标记指定为目标)运行lexer文件,则该字符串将解析为TERM(如预期的那样)。

如果运行解析器(“垃圾垃圾术语-tokens”),则会得到:

line 1:0 token recognition error at: 'a'
line 1:1 token recognition error at: 'e'
line 1:2 token recognition error at: 'e'
line 1:3 token recognition error at: 'e'
[@0,4:5='\r\n',<'
'>,1:4]

我先“编译”词法分析器,然后“编译”解析器,然后用javac生成生成的Java文件。 我在批处理文件中执行此操作,因此我非常有信心每次都执行此操作。

我不明白我在做什么错。 这是我运行grun的方式吗? 任何建议,将不胜感激。

永远相信您的直觉! grun内部有一些约定:-)请参见此处TestRig.java c。 第125、150行。如果还添加了一些其他CLI参数,本来会更好。

当词法分析器和语法分别编译时,文法名称-就您而言-将是(如TestRig用)“ Junk”,并且两个文件必须分别命名为“ JunkLexer.g4”和“ JunkParser.g4”。 因此,解析器文件JunkParser.g4的标头JunkParser.g4应修改

parser grammar JunkParser;
options { tokenVocab=JunkLexer; }
... stuff

现在您可以运行测试

> antlr4 JunkLexer
> antlr4 JunkParser
> javac Junk*.java
> grun Junk term -tokens
aeee
^Z
[@0,0:3='aeee',<TERM>,1:0]
[@1,6:5='<EOF>',<EOF>,2:0]
>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM