解析器不会使用C和ANTLR3编译

解析器不会使用C和ANTLR3编译,antlr,antlr3,Antlr,Antlr3,Clang正在抱怨我的ANTLR3 antlr-3.5.2-complete.jar解析器。我现在需要C,所以我只能使用ANTLR3。以下是语法错误: dwParser.c:2009:44:错误:使用未声明的标识符 “跟随第387号中的设置” 异常->预期设置=&遵循编号387中的设置; ^dwParser.c:2011:43:错误:使用未声明的标识符“FOLLOW\u set\u in\u g\u number387” 从不匹配的设置中恢复并遵循编号387中的设置 dwParser.c:162

Clang正在抱怨我的ANTLR3 antlr-3.5.2-complete.jar解析器。我现在需要C,所以我只能使用ANTLR3。以下是语法错误:

dwParser.c:2009:44:错误:使用未声明的标识符 “跟随第387号中的设置” 异常->预期设置=&遵循编号387中的设置; ^dwParser.c:2011:43:错误:使用未声明的标识符“FOLLOW\u set\u in\u g\u number387” 从不匹配的设置中恢复并遵循编号387中的设置

dwParser.c:162:91:注意:从宏展开 “从不匹配的数据集恢复” 定义RecoverFromMissitchedSets识别器->RecoverFromMissitchedSetRecognizer,s

所以它在抱怨g_数的后续集合

这就是全部语法。我已经扩展了一些包含在include文件中的声明。我已经详细地把每一个字都放进了Lexer的一半。但是错误信息非常不透明。有什么线索吗?ANTLR3手册中没有关于跟随集的内容

grammar dw;

options {
    language = C;
}

@parser::header {
    #include <assert.h>

    void dw_start(void);
    void dw_finish(void);
    void dw_arg_longlong(unsigned char *text);
    void dw_arg_long(unsigned char *text);
    void dw_arg_short(unsigned char *text);
    void dw_arg_char(unsigned char *text);
    void dw_arg_ulonglong(unsigned char *text);
    void dw_arg_ulong(unsigned char *text);
    void dw_arg_ushort(unsigned char *text);
    void dw_arg_uchar(unsigned char *text);
    void dw_arg_double(unsigned char *text);
    void dw_arg_float(unsigned char *text);
    void dw_label(unsigned char *text);
    void dw_address(unsigned char *text);
    void dw_opcode(unsigned char *text);
}

@lexer::header {
    #include <assert.h>

    void dw_start(void);
    void dw_finish(void);
    void dw_arg_longlong(unsigned char *text);
    void dw_arg_long(unsigned char *text);
    void dw_arg_short(unsigned char *text);
    void dw_arg_char(unsigned char *text);
    void dw_arg_ulonglong(unsigned char *text);
    void dw_arg_ulong(unsigned char *text);
    void dw_arg_ushort(unsigned char *text);
    void dw_arg_uchar(unsigned char *text);
    void dw_arg_double(unsigned char *text);
    void dw_arg_float(unsigned char *text);
    void dw_label(unsigned char *text);
    void dw_address(unsigned char *text);
    void dw_opcode(unsigned char *text);

    #define _empty NULL
}

g_program       : (instruction)+ ;

instruction     : { dw_start(); } g_label? g_ops g_args g_newline { dw_finish(); } ;

g_ops           : ID ID ID ID ;
g_args          :
                ( g_longlong
                | g_long
                | g_short
                | g_char
                | g_ulonglong
                | g_ulong
                | g_ushort
                | g_uchar
                | g_double
                | g_float
                | g_address
                ) ;

g_longlong      : g_ll  g_number    { dw_arg_longlong(  $g_number.text->chars); } ;
g_long          : g_l   g_number    { dw_arg_long(      $g_number.text->chars); } ;
g_short         : g_s   g_number    { dw_arg_short(     $g_number.text->chars); } ;
g_char          : g_c   g_number    { dw_arg_char(      $g_number.text->chars); } ;
g_ulonglong     : g_ull g_number    { dw_arg_ulonglong( $g_number.text->chars); } ;
g_ulong         : g_ul  g_number    { dw_arg_ulong(     $g_number.text->chars); } ;
g_ushort        : g_us  g_number    { dw_arg_ushort(    $g_number.text->chars); } ;
g_uchar         : g_uc  g_number    { dw_arg_uchar(     $g_number.text->chars); } ;
g_double        : g_d   FLOAT       { dw_arg_double(    $FLOAT.text->chars); } ;
g_float         : g_f   FLOAT       { dw_arg_float(     $FLOAT.text->chars); } ;
g_label         : ID    g_colon     { dw_label(         $ID.text->chars); } ;
g_address       : g_at  ID          { dw_address(       $ID.text->chars); } ;
g_opcode        : ID                { dw_opcode(        $ID.text->chars); } ;

g_number        : (HEX | DEC | OCT) ;

g_ll            : 'LL'  ;
g_l             : 'L'   ;
g_s             : 'S'   ;
g_c             : 'C'   ;
g_ull           : 'ULL' ;
g_ul            : 'UL'  ;
g_us            : 'US'  ;
g_uc            : 'UC'  ;
g_d             : 'D'   ;
g_f             : 'F'   ;
g_colon         : ':'   ;
g_at            : '@'   ;
g_newline       : '\n'  ;

OCT             : '0' ('0'..'7')+ ;
HEX             : '0' ('x' | 'X') ('0'..'9' | 'a'..'f' | 'A'..'F')+ ;
DEC             : '-'? ('0' | '1'..'9' '0'..'9'*) ;
FLOAT           : '-'? ('0'..'9')+ '.' ('0'..'9')* (('e' | 'E') ('+' | '-')? ('0'..'9')+)? ;
ID              : ('A'..'Z' | 'a'..'z')+ ;

WS              : (' ' | '\t' | '\r')+ ;
COMMENT         : '//' ~('\n' | '\r')* '\r'? '\n' ;

它在antlr本身工作正常吗?如果你是说ANTLR3会生成代码吗?对ANTLR3生成大量模板错误警告,但这是一个已知问题。然后生成dwLexer.c dwParser.c。我对源代码进行了模糊处理,并使用了ANTRL4。它在Java中的ANTLR4上生成干净的代码,但我正在看这个解析器是否会用javac.Oops编译,这是一个复制品,这种方法似乎建议用十六进制(HEX | DEC | OCT)内联替换g|u数,可以这么说,但这不起作用。相同的错误消息。虽然它有相同的错误信息,但这个问题是针对1.5的,并没有真正解释它的解决方案,只是它起了作用。好吧,我再次尝试了替换技巧,它起了作用。我不知道为什么,它确实会引起头痛处理十六进制|十二月|十月,但它的工作。
{
    // dw.g:52:11: ( ( HEX | DEC | OCT ) )
    // dw.g:
    {
        if ( LA(1) == DEC || LA(1) == HEX || LA(1) == OCT )
        {
            CONSUME();
            PERRORRECOVERY=ANTLR3_FALSE;
        }
        else
        {
            CONSTRUCTEX();
            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            EXCEPTION->expectingSet = &FOLLOW_set_in_g_number388;

            RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_g_number388);
            goto ruleg_numberEx;
        }
    }
}