2017-06-06 85 views
1

我正在做一些動手與antlr4解析一個文件,似乎是卡住了一個問題,讓我現在幾個小時醒了..以下是我定義的簡單語法放在我的項目src/main/antlr4中的ESQLGrammar.g4文件中。無法使用antlr4解析簡單語法

grammar ESQLGrammar; 

esqlCode: 
    declBrokerSchema? esqlContents; 

declBrokerSchema 
    : BROKER SCHEMA schemaName (PATH schemaPathList ';')?; 
schemaName 
    : IDENTIFIER; 
schemaPathList 
    : IDENTIFIER (',' IDENTIFIER)*; 

esqlContents 
    : (declareVariable)*?; 

declareVariable 
    : DECLARE variableNames esqlDataType ';'; 
variableNames 
    : variableName (',' variableName)*; 
variableName 
    : IDENTIFIER; 
esqlDataType  
    : (BLOB|CHARACTER|BOOLEAN|NAMESPACE); 

WS    : [ \r\t\n]+ -> skip ; 
IDENTIFIER  : [a-zA-Z_][a-zA-Z0-9_.]*; 

BROKER : 'BROKER'; 
SCHEMA : 'SCHEMA'; 
PATH : 'PATH'; 
DECLARE : 'DECLARE'; 
BLOB  : 'BLOB'; 
CHARACTER : 'CHARACTER'; 
BOOLEAN : 'BOOLEAN'; 
NAMESPACE : 'NAMESPACE'; 

我輸入的是一個文件

BROKER SCHEMA nameOfSchema PATH pathVal1,pathVal2; 
DECLARE iSharedVar CHARACTER; 

然而,當我改變如下語法線使用帶有多餘的空格固定的關鍵字,他們

declBrokerSchema 
    : 'BROKER SCHEMA ' schemaName ('PATH ' schemaPathList ';')?; 
// Notice the keywords in ' ' with extra space at end. 
declareVariable 
    : 'DECLARE ' variableNames esqlDataType ';'; 

那麼似乎解析線條並拋出下面提供的錯誤:

line 2:19 mismatched input 'CHARACTER' expecting {'BLOB', 'CHARACTER', 'BOOLEAN', 'NAMESPACE'} 

DeclBrokerSchema(schemaName=nameOfSchema, schemaPathList=pathVal1,pathVal2) 
[DeclareVariable(varibleNames=iSharedVar, dataType=CHARACTER, defultValue=null, modifier=null, isConstant=false, aliasType=null, initialValueExpression=null)] 

似乎認出它但有錯誤。因此,需要對這些你專家觀點:

  • 我找不到任何的可能已經匹配的「字符」在詞法分析器階段..然後爲什麼它拋出一個錯誤的規則?
  • 另外,爲什麼它需要我在''中使用標記,也有額外的空間?如果我刪除空間它不能解析它..

我是否缺少這裏的東西..請幫助..!

回答

1

你原來的語法很好,除了你的詞法分析規則中的一個小而重要的錯誤。由於這個錯誤的結果,幾乎所有你輸入的是由詞法分析器標記化作爲IDENTIFIER

[@0,0:5='BROKER',<IDENTIFIER>,1:0] 
[@1,7:12='SCHEMA',<IDENTIFIER>,1:7] 
[@2,14:25='nameOfSchema',<IDENTIFIER>,1:14] 
[@3,27:30='PATH',<IDENTIFIER>,1:27] 
[@4,32:39='pathVal1',<IDENTIFIER>,1:32] 
[@5,40:40=',',<','>,1:40] 
[@6,41:48='pathVal2',<IDENTIFIER>,1:41] 
[@7,49:49=';',<';'>,1:49] 
[@8,52:58='DECLARE',<IDENTIFIER>,2:0] 
[@9,60:69='iSharedVar',<IDENTIFIER>,2:8] 
[@10,71:79='CHARACTER',<IDENTIFIER>,2:19] 
[@11,80:80=';',<';'>,2:28] 
[@12,83:82='<EOF>',<EOF>,3:0] 

所以我們進行了修復移動爲IDENTIFIER的詞法規則的底部,使得規則不比賽高於一切:

etc... 
BLOB  : 'BLOB'; 
CHARACTER : 'CHARACTER'; 
BOOLEAN : 'BOOLEAN'; 
NAMESPACE : 'NAMESPACE'; 
IDENTIFIER  : [a-zA-Z_][a-zA-Z0-9._]*; 

現在,如果你運行它的詞法分析器你標記化所希望的方式:

[@0,0:5='BROKER',<'BROKER'>,1:0] 
[@1,7:12='SCHEMA',<'SCHEMA'>,1:7] 
[@2,14:25='nameOfSchema',<IDENTIFIER>,1:14] 
[@3,27:30='PATH',<'PATH'>,1:27] 
[@4,32:39='pathVal1',<IDENTIFIER>,1:32] 
[@5,40:40=',',<','>,1:40] 
[@6,41:48='pathVal2',<IDENTIFIER>,1:41] 
[@7,49:49=';',<';'>,1:49] 
[@8,52:58='DECLARE',<'DECLARE'>,2:0] 
[@9,60:69='iSharedVar',<IDENTIFIER>,2:8] 
[@10,71:79='CHARACTER',<'CHARACTER'>,2:19] 
[@11,80:80=';',<';'>,2:28] 
[@12,83:82='<EOF>',<EOF>,3:0] 

現在,它的工作原理。詞法規則的順序很重要。請記住,規則從上到下進行評估。 ;)

+0

奇妙..!這是當場..!感謝百萬@JLH這一個..!我現在瞭解antlr文檔中提到的排序,但可能沒有意識到它會產生很大的差異。接受和upvoted ..!再次感謝.. – Qadeer

+0

出於好奇,我如何獲得令牌作爲您打印的標記?它是一個調試參數還是你正在使用一些工具? – Qadeer

+0

我在-tokens模式下運行了名爲TestRig的Java應用程序,謝謝。 Terence Parr的關於Antlr的書中概述了它的使用。 – TomServo