我试图写一个小解析器使用反讽。不幸的是,我得到一个“转移,减少冲突”。语法是不是我的强项,我只需要得到这个一个小啄完成。下面是产生错误减小的语法:

ExpressionTerm := "asd"
LogicalExpression :=
    ExpressionTerm |
    LogicalExpression "AND" LogicalExpression |
    LogicalExpression "OR" LogicalExpression

这是什么了“轮班减少冲突”意思,我怎样才能解决呢?我推测,这意味着我的语法是模糊的,但我不能拧我足够的逻辑怎么看。

<强>加了:要澄清 - “ASD” 是一个简单的文本字符串 “ASD”。因此,我想到的是,下面的表达式是由这个语法解析:

asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd

<强>添加2:忘记说,语法的根是LogicalExpression

新增3:啊,我知道了!的模糊性是因为像

的表达
asd AND asd OR asd

可以以两种不同的方式来解释:

(asd AND asd) OR asd
asd AND (asd OR asd)

但我怎么能解决这个问题?好了,我可以把AND或OR的一个比对方强(我inteded反正)。但现在我看到,即使只有一个运营商出现的错误。换言之,这也产生了同样的错误:

LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression

在这种情况下,我想这样的:

asd OR asd OR asd

要被解析以这样:

(asd OR asd) OR asd

什么是这样做的非模棱两可的?

<强>加4:<!/强>知道了

LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"

此解析所有布尔表达式,与操作者的优先级作为不可─> AND-> OR。 “ASD”可以与用于你的条件表达式来代替。

有帮助吗?

解决方案

您的语法是不明确的,如果你只使用一个单一的前瞻。为了说明这一点,什么是“ASD”?它是一个ExpressionTerm或更长的任期。这是轮班减少冲突。这里我怀疑降低,减少冲突了。

大多数LL(1)/ LALR(1)的发电机将提供一些方法来处理经由运营商优先移减少冲突。大多数人也将默认为最长序列中的转变,减少冲突的存在,所以往往比这些更可以(部分推敲之后)被忽略。 (在这种情况下,也许需要在单个术语移到底部为它正确运行)。

其他提示

切换,减少冲突是指你的语法是不明确的。有了您的递归规则令牌“ASD”可以被解释为ExpressionTermLogicalExpression和解析器不能决定哪一部分。需要一个额外的规则,以打破平局。

切换减少冲突的困难事情让你的大脑,当周围谈到解析器之一。来说明该冲突的最简单的方法是在该伪代码:

if (a) then
   if (b) then
     printf('a + b');
   else
     print('this could be a + !b or !a');

else语句可以结合到第一或第二如果。在不明确的文法的情况下,通常定义一个值,以指示的预期移位降低你的语法的警告的数目。

可替换地,可以使用一个LL(k)或LL(*)解析器。这些类型的解析器没有移位/减少歧义。根据应用程序的它们可以比LALR(1)解析器更容易或更难。

语法是在LL(1)LALR(1)模糊的,因为ASD令牌可以在ExpressionTerm被取代,并且还LogicalExpression弄平语法规则来解决移/减少冲突

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