[英]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.