我对Antlr是相对较新的,我有一个当前的项目,需要从Antlr3(3.5版(合并为Antlr4。我已经通过这本书尝试了演示,这一切都很好,但是我自己的项目给了我以下问题:
将Antrl3项目转换为Antlr4项目(解决所有警告和错误(后,我能够构建lexer.h和lexer.cpp文件,但是以下错误出现了:错误(33(:丢失代码生成模板非局部trrefheader错误(33(:缺少代码生成模板setNonlocalattrheader(大约50次(。我无法在任何地方找到这些模板的任何参考。是否有人可以阐明这些错误消息?因为他们对Line No的任何话都不说,或者参考我在黑暗中完全看的任何其他代码。
我已经设置了一个测试环境,测试了演示G4文件。我已经将G4文件从我的(VS2017(项目中抽出,并使用批处理文件单独尝试了它。
由于缺乏参考,我无法显示原因的实际代码。我尝试了部分分析,但是我无法从中获得任何线索。
显示了这些错误:错误(33(:丢失代码生成模板非局部trrefheader错误(33(:缺少代码生成模板setNonlocalattrheader
我已经构建了一个小例子来证明问题:
/*
* AMF Syntax definition for ANTLR.
*
*/
grammar amf;
options {
language = Cpp;
}
amf_group[amf::AmfGroup& amfGroup] locals [int jsonScope = 2]
: statements=amf_statements (GROUPSEP WS? LINE_COMMENT? EOL? | EOF)
{
amfGroup.SetStatements(std::move($statements.stmts));
}
;
amf_statements returns [amf::AmfStatements stmts]
: ( WS? ( stmt=amf_statement { stmts.emplace_back(std::move($stmt.value)); } WS? EOL) )*
;
amf_statement returns [amf::AmfStatementPtr value]
: (
{$amf_group::jsonScope == 1}? jsonparent_statement
| {$amf_group::jsonScope == 2}? jsonvalue_statement
)
{
value = std::move(context.expression(0).value);
}
;
jsonparent_statement returns [amf::AmfStatementPtr value] locals [int lineno=0]
:
(T_JSONPAR { $lineno = $T_JSONPAR.line;} ) WS (arg=integer_const)
{
value = std::make_shared<amf::JSONParentStatement>($lineno, nullptr);
}
;
jsonvalue_statement returns [amf::AmfStatementPtr value] locals [int lineno=0]
: ( T_JSONVALUE { $lineno = $T_JSONVALUE.line; } ) WS (arg=integer_const) (WS fmt=integer_const)?
{
value = std::make_shared<amf::JSONValueStatement>($lineno, std::move(arg), std::move(fmt));
}
;
integer_const returns [amf::AmfArgPtr value]
: p='%' (
(signed_int)
{
long num = std::stol($signed_int.text);
value = std::make_shared<amf::AmfArg>(ARG_TYPE::ARG_INTEGER, num);
}
| signed_float
{
value = std::make_shared<amf::AmfArg>(ARG_TYPE::ARG_INTEGER, std::stof($signed_float.text));
}
)
;
signed_int
: MINUS? INT;
signed_float
: MINUS? FLOAT;
T_JSONPAR : 'JSONPAR' | 'JSONPARENT';
T_JSONVALUE : 'JSONVAL' | 'JSONVALUE';
/* Special tokens */
GROUPSEP : '%%';
MINUS : '-';
INT : DIGIT+;
FLOAT
: DIGIT+ '.' DIGIT* EXPONENT?
| '.' DIGIT+ EXPONENT?
| DIGIT+ EXPONENT
;
ID : ('A'..'Z'|'_') ('A'..'Z'|'0'..'9'|'_')*
;
COMMENT
: ('/*' .*? '*/') -> channel(HIDDEN)
;
LINE_COMMENT
: ('//' ~('n'|'r')* 'r'?) -> channel(HIDDEN)
;
EOL : ('r'? 'n');
QOUTED_STRING
: '"$' ( ESC_SEQ | ~('\'|'"') )* '"'
;
SIMPLE_STRING
: '$' ~(' '|'t'|'r'|'n')*
;
WS : (' '|'t')+;
fragment
DIGIT
: '0'..'9'
;
fragment
EXPONENT
: 'E' ('+'|'-')? ('0'..'9')+
;
fragment
ESC_SEQ
: '\' (
'R'
|'N'
|'T'
|'"'
|'''
|'\'
)
;
我添加AMF_Statement的谓词(在这种情况下为4次"丢失非localattrterttrtefheader的代码生成模板(时,错误就会发生。我尝试将输出语言更改为Python或CSHARP,但这无济于事。
仔细查看了我在执行Java命令的批处理命令上偶然发现的所有步骤后:我使用了以前的Antrl3批处理文件的副本,-jar选项执行antlr-4.7.2-complete.jar而不是CP并执行org.antlr.v4.tool。似乎一切顺利,显示命令行选项很好,语法错误都到位,直到创建了实际的lexer和解析器代码为止:然后显示错误(33(,但只有使用动态范围,否则一切似乎都很好。
更新:我认为我可以继续进行项目,但这只是一个部分解决方案:当我切换回CPP输出时,错误返回。标准输出ANF CSHARP输出是可以的,当我尝试生成CPP输出后,我会在使用动态范围时再次收到相同的错误:第25和26行。如果我删除了谓词,则错误会消失。
所以我仍然遇到这些错误,但仅适用于C 。