在语法文件上运行C 的ANTL4解析器显示错误33:缺少代码生成模板非局部trrefheader



我对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 。

最新更新