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

Parsing 使用lexer语法运行Antlr4解析器会获得令牌识别错误,parsing,antlr4,Parsing,Antlr4,我正试图创建一个语法来解析Solr查询(只是稍微相关,回答这个问题不需要了解Solr的任何内容——只需要比我了解更多关于antlr 4.7的内容)。我基于Solr6中的QueryParser.jj文件。我找了一个现有的,但似乎没有一个不是旧的和过时的 我被卡住了,因为当我尝试运行解析器时,我得到了“令牌识别错误” 我创建的lexer使用lexer模式,据我所知,这意味着我需要一个单独的lexer语法文件。所以,我有一个解析器和一个lexer文件 我把它缩减为一个简单的例子来说明我看到了什么。也许

我正试图创建一个语法来解析Solr查询(只是稍微相关,回答这个问题不需要了解Solr的任何内容——只需要比我了解更多关于antlr 4.7的内容)。我基于Solr6中的QueryParser.jj文件。我找了一个现有的,但似乎没有一个不是旧的和过时的

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

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

我把它缩减为一个简单的例子来说明我看到了什么。也许有人能告诉我我做错了什么。下面是解析器(Junk.g4):

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

这是lexer(JLexer.g4):

如果我将lexer代码复制到解析器中,那么事情就会按预期工作(例如,“aeee”是一个术语)。此外,如果我使用grun运行lexer文件(将令牌指定为目标),那么字符串将解析为一个术语(如预期的那样)

如果我运行解析器(“grun Junk 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]
行1:0令牌识别错误位于:“a”
第1行:1“e”处的令牌识别错误
第1行:2“e”处的令牌识别错误
第1行:3“e”处的令牌识别错误
[@0,4:5='\r\n',1:4]
我首先“编译”lexer,然后“编译”解析器,然后用javac生成java文件。我在一个批处理文件中执行此操作,所以我非常自信每次都在执行此操作


我不明白我做错了什么。这是我跑步的方式吗?任何建议都将不胜感激。

始终相信你的直觉!
grun
:-)内部有一些约定,请参见这里的c。第125行,第150行。如果还添加了一些额外的CLI参数,会更好

当分别编译lexer和grammar时,语法名称(在您的例子中)将是(只要
TestRig
goes)“垃圾”,并且这两个文件必须命名为“JunkLexer.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]
>
>antlr4垃圾车
>antlr4军舰
>javac垃圾*.java
>grun垃圾术语-代币
aeee
^Z
[@0,0:3='aeee',1:0]
[@1,6:5='',,2:0]
>

始终相信自己的直觉!
grun
:-)内部有一些约定,请参见这里的c。第125行,第150行。如果还添加了一些额外的CLI参数,会更好

当分别编译lexer和grammar时,语法名称(在您的例子中)将是(只要
TestRig
goes)“垃圾”,并且这两个文件必须命名为“JunkLexer.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]
>
>antlr4垃圾车
>antlr4军舰
>javac垃圾*.java
>grun垃圾术语-代币
aeee
^Z
[@0,0:3='aeee',1:0]
[@1,6:5='',,2:0]
>

这一点信息帮助我编译了XML语法……谢谢……;)这一点信息帮助我编译了XML语法……谢谢……;)