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)]
似乎認出它但有錯誤。因此,需要對這些你專家觀點:
- 我找不到任何的可能已經匹配的「字符」在詞法分析器階段..然後爲什麼它拋出一個錯誤的規則?
- 另外,爲什麼它需要我在''中使用標記,也有額外的空間?如果我刪除空間它不能解析它..
我是否缺少這裏的東西..請幫助..!
奇妙..!這是當場..!感謝百萬@JLH這一個..!我現在瞭解antlr文檔中提到的排序,但可能沒有意識到它會產生很大的差異。接受和upvoted ..!再次感謝.. – Qadeer
出於好奇,我如何獲得令牌作爲您打印的標記?它是一個調試參數還是你正在使用一些工具? – Qadeer
我在-tokens模式下運行了名爲TestRig的Java應用程序,謝謝。 Terence Parr的關於Antlr的書中概述了它的使用。 – TomServo