当前位置: 首页 > 知识库问答 >
问题:

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

冯茂实
2023-03-14

我正在尝试创建一个语法来解析Solr查询(只需要稍微相关,您不需要了解任何关于Solr的信息来回答这个问题--只需要比我了解更多关于ANTLR4.7的信息就可以了)。我将它建立在Solr6中的QueryParser.jj文件的基础上。我找了一个现存的,但似乎没有一个不是旧的和过时的。

我被困住了,因为当我尝试运行解析器时,我得到了“token recognition error”。

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

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

grammar Junk;

options {
  language = Java;
  tokenVocab=JLexer;
}

term : TERM '\r\n'; 

我不能使用导入,因为我试图创建的lexer文件中的lexer模式(如果我使用导入,模式中的令牌将变为“未定义”)。这就是为什么我引用带有tokenVocab参数的lexer文件(如github中的XML示例所示)。

下面是lexer(jlexer.g4):

lexer grammar JLexer;

TERM : TERM_START_CHAR TERM_CHAR* ;

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

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

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]

我不明白我做错了什么。是我经营Grun的方式吗?如有任何建议,将不胜感激。

共有1个答案

计阳泽
2023-03-14

永远相信你的直觉!grun内部有一些约定:-)参见这里的testrig.java c.第125、150行。如果还添加一些额外的CLI参数,会好得多。

当lexer和grammar分别编译时,语法名称--在您的例子中--将是(只要testrig为)“junk”,并且这两个文件必须命名为“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来解析一些简单的HTML文件。我已经将语法分为解析器语法和lexer语法,这样我就可以对标记内部的东西( )使用孤岛语法,如“确定的ANTLR4引用”中所述。antlr4反复告诉我“令牌识别错误”。 解析器语法: 示例HTML文件: ANTLR4的输出:

  • 我试图使用ANTLR4创建一个简单的解析器,但我在识别lexer令牌方面遇到了问题。问题是,即使单词SAYS后面有一个“:”,解析器规则也不能识别它。而且对于提及,@Michael也没有被识别出来。 输入的文本是:john说:hello@Michael这将不起作用 //LEXER规则

  • 我正在编写一个ANTLR Lexer和解析器语法,它将解析与Java类非常相似的文本。最终,它将解析如下所示的文本: 我正在慢慢地构建Lexer和Parser。我已经成功地解析了,但是在解析时遇到了困难。 在添加对的支持之前,我能够在解析器中为空格、冒号和分号使用字符串文字,但在我遇到错误创建隐式标记。我为这些字符中的每一个定义了一个词法分析器规则,并用该规则替换了所有出现的文字。但是,这破坏了s

  • 我正在使用GitHub提供的antlr4语法分析器和词法分析器来解析Python3中的PHP。 当我直接使用这些语法时,我的PoC代码工作: antlr试验。py 这给出了输出 当我使用以下PHP时。g4语法,我犯了很多错误: 在对pythons导入交换评论之后,我得到了这个错误 然而,当我在语法上运行antlr4工具时,我没有出错。我在这里被难住了——是什么导致了这个问题?

  • 我目前正在开发一个孤岛语法解析器,用于解析同一个文件中的两种编程语言。第二种编程语言的语句总是以一个特殊的字符(*)开始,但它们可以有两种形式:内联语句或多行语句。 如果是内联语句,行以*开始,以换行符(\r?\n)结束。 我很难使用ANTLR4的lexer模式来完成这一点。有人能给我指个正确的方向吗? 我在下面给出了我的语法。下面的示例中,解析器显示了两个错误 示例: lexer: 语法: 它对

  • 我通过RestTemplate调用一个endpoint,如下所示: 我已经验证了对象中的JSON字符串是有效的,方法是将其复制并在对同一endpoint的cURL请求中使用,没有任何错误。在此请求中也使用了相同的头和授权令牌。 当我执行POST时,返回以下错误: 我的和头都设置为。通过检查来自cURL的输出,我看到响应体中没有汉字。 响应标头如下: 当我将设置为或时发出请求,响应是中文字符: 我希