问题解决我的语法的转变,减少冲突
-
05-09-2019 - |
题
我试图写一个小解析器使用反讽。不幸的是,我得到一个“转移,减少冲突”。语法是不是我的强项,我只需要得到这个一个小啄完成。下面是产生错误减小的语法:
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”可以被解释为ExpressionTerm
或LogicalExpression
和解析器不能决定哪一部分。需要一个额外的规则,以打破平局。
切换减少冲突的困难事情让你的大脑,当周围谈到解析器之一。来说明该冲突的最简单的方法是在该伪代码:
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
弄平语法规则来解决移/减少冲突