2016-04-05 20 views
-1

我在YACC和C/C++中编写程序。它解析一个相当简单的语法并将结果存储在一些表中。YACC:我可以从我的“语义”处理中生成“语法错误”吗?

我有一个像

room: DOTR ID roomname { AddRoom($3, $2); }; 

和AddRoom代码规则:

void AddRoom(const char* name, const char* id) 
{ 
    theRoom = (void)new GameRoom(name, id); 
    if (!theGame->addRoom(theRoom)) { 
     ????? 
    } 
} 

????我会插入代码来生成语法错误(我希望)。

此代码的目的是游戏中的每个对象(房间,门,NPC,东西)都有唯一的ID。如果theGame->addRoom检测到ID不唯一,它将返回false,并且我希望yacc在输入的那一点显示一条错误消息 - 就像非法令牌已经存在一样。

回答

1

只需拨打电话yyerror(),并记住有错误,所以您不会进入后期阶段。但你不是想把这当作一个语法错误:否则你会导致解析器开始丢弃令牌等。

+0

谢谢。这回答了我的问题。 呃......如果我所有的yyerror都不会让它开始丢弃令牌? 因为你是对的,我想记住我有一个错误(1),但我不想放弃令牌。 只是出于好奇,如果我_wanted_开始丢弃令牌,我该怎么办? (1)我将代码添加到yyerror以设置全局标志。如果该标志被设置,我将不会生成输出。 –

+0

D'oh!当然调用yyerror不会对语法识别器做任何事情:body只是一个printf来产生错误信息... –