Парсер не скомпилируется с C и ANTLR3
Clang жалуется на мой анализатор ANTLR3 (antlr-3.5.2-complete.jar). Мне нужен C сейчас, и поэтому я застрял с ANTLR3. Это синтаксические ошибки:
dwParser.c: 2009: 44: ошибка: использование необъявленного идентификатора 'FOLLOW_set_in_g_number387' EXCEPTION-> hopeingSet = &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->coverFromMismatchedSet(RECOGNIZER, s)
Так что он жалуется на следующий набор g_number.
Это вся грамматика. Я расширил некоторые объявления, которые были бы во включаемом файле. И я многословно толкнул каждый литерал в половину Лексера. Но сообщения об ошибках довольно непрозрачны. Есть какие-нибудь подсказки? Ничего в книге 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;
}
}
}