解析器不会使用C和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:91:注意:从宏展开 “从不匹配的数据集恢复” 定义RecoverFromMissitchedSets识别器->RecoverFromMissitchedSetRecognizer,s 所以它在抱怨g_数的后续集合 这就是全部语法。我已经扩展了一些包含在include文件中的声明。我已经详细地把每一个字都放进了Lexer的一半。但是错误信息非常不透明。有什么线索吗?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
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;
}
}
}