我为布尔和算术表达式制作了一个语法。我想处理算术表达式,例如:
(1+5)+(-3)
我已经完成了这项工作:我可以处理我想要的所有表达式。
我的问题是布尔表达式可能类似于:
( ( (2+2==4) or (3>2) ) and 2==2)
所以在某些时候我的布尔规则必须引用我的算术表达式规则。我不能在布尔规则中使用括号 (),因为它会导致我的语法不明确。我明白为什么,但我无法找到解决这个问题的方法。
我为布尔和算术表达式制作了一个语法。我想处理算术表达式,例如:
(1+5)+(-3)
我已经完成了这项工作:我可以处理我想要的所有表达式。
我的问题是布尔表达式可能类似于:
( ( (2+2==4) or (3>2) ) and 2==2)
所以在某些时候我的布尔规则必须引用我的算术表达式规则。我不能在布尔规则中使用括号 (),因为它会导致我的语法不明确。我明白为什么,但我无法找到解决这个问题的方法。
这个为 GOLD 编写的 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> ')'
对于 bool 部分,重用了算术语法的典型概念。没有什么新东西,只是不同类型的布尔运算符的优先级更高。
只需将“==”添加到比较中,将“或”添加到 BoolConcat 等等。