2013-03-23 33 views
0

我已经为布尔和算术表达式做了一个语法。我想处理像算术表达式:LALR语法模糊

(1+5)+(-3) 

我与所做的工作:我可以处理所有我想要的表情。

我的问题是一个布尔表达式可以是这样的:那么在某些时候我的布尔规则不得不提到我的算术表达式规则

(((2+2==4) or (3>2)) and 2==2) 

。我不能在我的布尔规则中使用括号(),因为它会导致我的语法不明确。我明白为什么,但我无法弄清楚这个问题的解决方案。

+0

到目前为止您尝试过什么?显示您的代码并提供yacc标识的冲突的详细信息。 – 2013-03-25 14:33:06

+0

在布尔表达式和算术表达式中都没有任何含括号的含糊不清的含义(简单的做法会使语法不是LL,但对于LR来说很好)。你有什么尝试? – 2014-06-17 04:45:16

+0

[简单模糊语法与减少 - 减少冲突]的可能重复(http://stackoverflow.com/questions/12887072/simple-ambiguous-grammer-with-reduce-reduce-conflict) – 2014-06-17 06:01:48

回答

1

这对黄金应该让你写的LALR语法开始:

<Formula>  ::= <BoolConcat> <Formula> | <BoolConcat> 

<BoolConcat> ::= <BoolConcat> 'and' <Comparison> | <Comparison> 

<Comparison> ::= <Comparison> '>' <Expression> | <Expression> 

<Expression> ::= <Expression> '+' <Term> | <Term> 

<Term> ::= <Term> '*' <Fact> | <Fact> 

<Fact> ::= Integer | '(' <BoolConcat> ')' 

对于布尔一部分算术语法典型的概念被重新使用。没有新东西,只有不同类型的布尔运算符具有新的优先级。

只需将'=='添加到比较,或'BoolConcat等等。