2009-12-10 62 views
0

所以,我解析Hayes调制解调器AT命令。不从文件中读取,而是以char *的形式传递(我正在使用C)。在Lexer/Parser中处理无效输入

1)如果我得到了我完全不认识的东西,会发生什么?我该如何处理? 2)如果我有像

my_token: "cmd param=" ("value_1" | "value_2"); 

和接收“参数”无效值?

我看到一些建议,让后端程序(在C中)处理它,但这对我来说是违背谷物的。尽可能早地捕捉问题,是我的座右铭。

是否有任何方法来捕捉词法分析器/解析器规则中的“其他”条件?

在此先感谢...

回答

0

我认为你正在寻找Custom Syntax Error Recovery来嵌入你的语法。

编辑

我和ANTLR和C(或C单独为此事)没有经验,所以按照这个建议慎用! :)

纵观页:http://www.antlr.org/api/C/using.html,也许底部的一部分,实现定制方法是你追求的。

HTH

+0

现在,这更像是它。当然,除了Java之外。 当我看着生成的C代码,我看到

if (HASEXCEPTION())
的问题是,当然,我从来没有想编辑生成的C代码的情况下,我找到一个词法或语法分析规则中的错误,重新生成代码失去我的改变。 这就是为什么我想在ANTLR的文件类似
My_rule:  { My_rule:  { 
Mawg 2009-12-12 03:59:29

+0

的例子说

 myRule: TOK TOK1 TOK2 subRule? ; catch [RecognitionException re] { // First, let's report the error as the user needs to know about it // reportError(re); myRecoverMethodForMyRule(); } 
但我怎么能实现呢?对于有效输入有一个规则,其次是我通配符的地方? 感谢您的helk到目前为止,你让我接近它... – Mawg 2009-12-12 04:01:20

+0

或者我应该重写recoverFromMismatchedToken(()? – Mawg 2009-12-12 04:03:16

1

这事情是这样的:你的解析器和词法分析器的整点是要炸毁如果你错误的输入,那么你赶上炸毁,并呈现漂亮的错误信息给用户。

+0

哎呀,这并不容易。我忘了提到我在另一个主题中所说的话。输入不在像编译器那样一次解析的文件中。 这是一个嵌入式系统。每当用户发送一个AT命令时,该命令就被解析并执行。一段时间后来另一个命令... 无论如何,我可以验证生成的C代码中的输入,但我更愿意尽早检测它。我想在词法分析器或解析器中捕获它,然后使用快速C代码来回复“ERROR”。 – Mawg 2009-12-12 03:17:27