簡體   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