请原谅我,我完全新的解析和Lex / YACC,我可能是在方式在我的头上,但还是:

我在写与PLY一个非常基本的计算器,但它的输入可能不会永远是一个方程,我需要确定它是否还是不解析时。输入的极值将是一些完全计算结果为方程,它分析细并计算,或东西是不一样的公式,从而未能解析和也可以。

在灰色区域是具有方程状部分,其中所述解析器将抓住并制定出的输入。这不是我想要的东西 - 我需要能够告诉我们,如果字符串的部分没有得到回升和记号化,所以我可以背摔一个错误,但我不知道如何做到这一点。

有谁知道我如何定义,基本上,一个“捕捉到任何剩下的”令牌?还是有更好的方法可以让我处理呢?

有帮助吗?

解决方案

有在YACC内置error令牌。你通常会做这样的事情:

line: goodline | badline ;

badline : error '\n' /* Error-handling action, if needed */

goodline : equation '\n' ;

这不匹配equation任何线将由badline处理。

您可能需要使用yyerrok在错误处理措施,以确保错误处理重置下一行。

其他提示

定义的令牌(输入端),以及使你的词法分析器输出它在输入的结束。

此之前,如果你有这些标记:

'1' 'PLUS' '1'

您现在将有:

'1' 'PLUS' '1' 'END_OF_INPUT'

现在,你可以在你的解析器定义顶级规则。代替(例如):

Equation ::= EXPRESSION

您将有

Equation ::= EXPRESSION END_OF_INPUT

显然,你必须在PLY语法重写这些,但是这应该让你最的方式。

我通常使用一个单独的“命令读者获得一个完整的命令 - 可能是在你的情况下,线 - 到主变量字符串,然后安排词法分析器来分析字符串,包括告诉我,当它没”吨到达终点。这是很难成立,但使错误的一些类更加容易。一个我经常使用这种技术的地方有3个评论约定,两套引用的字符串,以及其他一些脏东西多行命令来设置边缘我的牙齿(上下文敏感的标记化 - !呸)。

否则,唐的与Yacc的“错误”令牌的建议是好的。

看起来你已经找到了解决办法,但我会在情况下添加其他建议您或其他有兴趣的另一种方法。

你说你正在使用PLY,但就是因为你希望编译器在Python环境中运行?如果是的话,你可能会考虑其他工具为好。对于这样的作业我经常使用ANTLR( http://www.antlr.org ),其具有Python代码发生器。 ANTLR有很多技巧为做这样的事情在词法水平吃了一堆的输入所以解析器永远看不到它(例如,评论),调用一个更大的语法中的子规则(例如方程式)(应终止一次的能力规则已不处理任何更多的输入被匹配......听起来有点像你想要做什么)和一个非常漂亮的左保理算法。

ANTLRs解析能力与使用StringTemplate的组合( http://www.stringtemplate.org )引擎使一个很好的组合和两支撑的Python(以及许多其他)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top