无法使用antlr4解析简单语法
unable to parse simple grammar using antlr4
我正在用 antlr4 做一些解析文件的实践,似乎被一个问题困住了,这个问题让我现在几个小时都睡不着觉。以下是我在 ESQLGrammar.g4 文件中定义的简单语法放在我的项目中 src/main/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;
但是,当我如下更改语法行以使用带有额外 space 的固定关键字时
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)]
似乎可以识别它,但有错误。所以需要你的专家意见:
- 我在词法分析器阶段找不到任何可以匹配 'CHARACTER' 的规则。那为什么会抛出错误?
- 此外,为什么它还要求我使用 ' ' 中的标记和额外的 space?如果我删除 space 它无法解析它..
我是不是遗漏了什么..请帮助..!
除了词法分析器规则中的一个小错误外,您的原始语法没有问题。由于这个错误,几乎所有的输入都被词法分析器标记为 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]
现在可以了。词法分析器规则的顺序很重要。请记住,规则是从上到下评估的。 ;)
我正在用 antlr4 做一些解析文件的实践,似乎被一个问题困住了,这个问题让我现在几个小时都睡不着觉。以下是我在 ESQLGrammar.g4 文件中定义的简单语法放在我的项目中 src/main/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;
但是,当我如下更改语法行以使用带有额外 space 的固定关键字时
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)]
似乎可以识别它,但有错误。所以需要你的专家意见:
- 我在词法分析器阶段找不到任何可以匹配 'CHARACTER' 的规则。那为什么会抛出错误?
- 此外,为什么它还要求我使用 ' ' 中的标记和额外的 space?如果我删除 space 它无法解析它..
我是不是遗漏了什么..请帮助..!
除了词法分析器规则中的一个小错误外,您的原始语法没有问题。由于这个错误,几乎所有的输入都被词法分析器标记为 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]
现在可以了。词法分析器规则的顺序很重要。请记住,规则是从上到下评估的。 ;)