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