这是一个含糊不清的语法吗?我该如何解决?

时间:2010-06-26 01:14:05

标签: algorithm grammar theory context-free-grammar

为了序言,我对这种东西的了解很少。

无论如何,我一直在开发一个无上下文语法来描述alegbraic表达式的结构,所以我可以自学一下CYK解析算法是如何工作的。我理解这样的结构如何只使用中缀代数表达式,但我无法理解如何开发一个可以处理“ - ”运算符的一元和二元定义的语法。

作为参考,这是我在CNF写的语法(其中S是起始符号):

S - > x
A - > O S
S - > L B
B - > S R
S - > K S
O - > +
O - > -
O - > *
O - > /
O - > ^
K - > -
L - > (
R - > )

问题是CYK解析算法如何提前知道是否在S - >之间做出决定。 K S和A - > O S遇到“ - ”运算符?这样的语法上下文了吗?最重要的是,由于编程语言可以处理二进制和一元减号的语言,我应该如何合理地解析它呢?

3 个答案:

答案 0 :(得分:5)

这似乎是一个与有限状态自动机相关的问题,我不记得我的课程中的所有内容,但我在OCaml中写了一个CYK解析器,所以我会继续拍摄:)

例如,如果您尝试解析3- -4这样的表达式,那么您的S -> K S规则将使用-4,然后您的A -> O S规则会吸收- -4。这最终将达到最顶级S生产规则。您应该小心使用您正在使用的语法,因为您列出的A制作规则无法从S到达,您可能应该有S -> S O S某种规则。< / p>

CYK解析算法的工作方式是通过回溯,而不是通过你在问题中提到的“提前知道”。您的CYK算法应该做的是将-4解析为S -> K S规则,然后它会尝试再次使用-规则吸收第二个S -> K S,因为此生产规则允许任意长链的一元-。但是一旦你的算法意识到它坚持使用中间解析3 S,它就会意识到它没有可用于解析它的生产符号。一旦它意识到这不再是可解析的,它就会返回,而是尝试将-解析为S -> O S规则,然后继续它的快乐方式。

这意味着你的语法仍然没有上下文,因为上下文敏感的语法意味着你在生产规则的左侧有终端,所以你在这方面很好。 HTH!

答案 1 :(得分:2)

语法不明确,解析器无法决定采用哪种情况。

您应该使用如下语法:

S -> EXPR
EXPR -> (EXPR)
EXPR -> - EXPR
EXPR -> EXPR + EXPR
EXPR -> EXPR - EXPR
// etc...

答案 2 :(得分:1)

基于代数表达式的语法很难消除歧义。以下是一些需要解决的问题示例:

a + b + c自然地创建了两个解析树。要解决此问题,您需要解决+的关联性的模糊性。您可能希望让从左到右的解析策略为您解决此问题,但要小心:取幂可能应该从右到左关联。

a + b * c自然地创建两个解析树。要解决此问题,您需要处理运算符优先级。

隐式乘法(a + bc),如果允许,会产生各种噩梦,主要是在标记化时。

正如你所提到的,一元减法是有问题的。

如果我们想要解决这些问题,但仍然有专门用于代数的快速解析语法,一种方法是拥有EXPR的各种“级别”,一个用于优先级所需的每个级别的绑定。例如,

TERM -> (S)
EXPO -> TERM ^ EXPO
PROD -> PROD * EXPO
PROD -> PROD / EXPO
PROD -> -PROD
SUM -> SUM + PROD
SUM -> SUM - PROD
S -> SUM

这要求您还允许“促销”类型:SUM - &gt; PROD,PROD - &gt; EXP,EXP - &gt; TERM等,以便事情可以终止。

希望这有帮助!