解析器不能用C和ANTLR3编译

时间:2015-02-25 00:20:49

标签: antlr antlr3

Clang抱怨我的ANTLR3(antlr-3.5.2-complete.jar)解析器。我现在需要C,因此我坚持使用ANTLR3。这些是语法错误:

  

dwParser.c:2009:44:错误:使用未声明的标识符   ' FOLLOW_set_in_g_number387'                   EXCEPTION-> expectingSet =& FOLLOW_set_in_g_number387;                                              ^ dwParser.c:2011:43:错误:使用未声明的标识符' FOLLOW_set_in_g_number387'                   RECOVERFROMMISMATCHEDSET(安培; FOLLOW_set_in_g_number387);

     

dwParser.c:162:91:注意:从宏扩展   ' RECOVERFROMMISMATCHEDSET'   定义RECOVERFROMMISMATCHEDSET(s)RECOGNIZER-> recoverFromMismatchedSet(RECOGNIZER,s)

所以它抱怨下面的g_number。

这是整个语法。我已经扩展了一些包含在包含文件中的声明。而且我已经将每一个文字都推到了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' ;

dwParser.c中的实际块是:

{
    // 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;
        }
    }
}

0 个答案:

没有答案