算术表达式的无歧义语法,没有冗余括号

时间:2011-01-08 05:07:47

标签: context-free-grammar regexp-grammars

我正在寻找一个没有多余括号的算术表达式的明确语法。例如,括号在id+(id*id)中是多余的,但在(id+id)*id中不是。

2 个答案:

答案 0 :(得分:4)

您可以轻松完成此操作。括号变得必要的唯一时间是将和表达式作为乘法表达式的一部分,或者某个表达式作为除法表达式之一的第二部分。在任何一种情况下,您都可以通过强制括号内的材料至少有一个裸操作符(不被其他括号括起来)来确保括号不是多余的。

我想我可能正在帮你回答入学考试或家庭作业的问题,我不太喜欢,但每个人都认为这是不可能的或暗示这可能是不可能的,这是错的,我想设置它们直。

您想要解析表达式:

expr      ::= expr addsub term
expr      ::= prodterm
expr      ::= value

sum       ::= expr addsub term

addsub    ::= '+' | '-'

term      ::= prodterm
term      ::= unit

prodterm  ::= term '*' unit
prodterm  ::= term '/' produnit

unit      ::= '(' sum ')'
unit      ::= value

produnit  ::= unit
produnit  ::= '(' prodterm ')'

value     ::= '0-9'*

唯一的值永远不会有围绕它的括号。单位是乘法表达式的子表达式; produnits允许括号表达式的括号。 (5)将是(值),这是不可能的,因为只有produnits和unit有括号,并且如果它们存在,它们需要在括号内发生一些算术运算符。 (value)不能从任何表达式派生,并且((任何))是不可能的,因为只有produnit和unit得到括号。仔细观察,如果推导出括号,或者要将其解析为单位,或者没有括号的值,则produnit需要*或a /。单位需要+或a - 出现,或没有括号。

((5 + 6))失败,因为(5 + 6)只能作为一个单元进行解析,这可能使它成为一个产品,但是没有办法将括号放在一个单独的产品周围 - 没有链子将一个单位或一个产品变成一个单独的产品周围的括号。

我会为你分解我的选择:5 *(6 * 7)不解析 - 你认为它是一个单位的术语,但是那时(6 * 7)不是单位,因为单位必须是具有至少一个总和的表达式的值或括号。一旦出现至少一个总和,则括号不是微不足道的。另一方面,5 /(6 * 7)与5/6 * 7完全不同 - 第一个像5/6/7,第二个像5 * 7/6。但是,5 /(6)与5/6相同 - 括号内不能出现单个值。同样,5 /(6/7)与5/6/7不同,因为第一个与5 * 7/6相同,第二个与5 /(6 * 7)相同。换句话说,如果内部有一个裸操作员,那么分母周围的括号永远不会是无关紧要的。

(5 + 6)+7也是不可能的,因为总和的左手侧(和右手侧)是严格的值,总和周围没有括号的总和,或产品周围没有括号的产品。没有办法转

你可以说服自己坚持这一点,并亲自检查一下它是否明确无误。你可以通过扩展它来包含指数运算符,或者更好地将它概括为更高优先级的运算符,或更低优先级的运算符,如==或<。

,来向自己证明它是持有的。

我希望这有帮助!

答案 1 :(得分:2)

这完全取决于'对于没有多余括号的算术表达式'的含义。这将接受没有多余括号的表达式,但也会接受任意嵌套的括号:

expr   ::= factor
expr   ::= factor mul_div factor

mul_div ::= '*' | '/'

factor ::= term
factor ::= term add_sub term

add_sub ::= '+' | '-'

term   ::= NUMBER
term   ::= '(' expr ')'

我假设NUMBER设法识别已签名的号码,因此那里没有一元加或减。如果需要,您可以了解如何处理它们。如果需要,您还可以添加变量等。

如果你的意思是拒绝带有不必要括号的表达式的语法,那么我认为你正在寻找一种不是无上下文语法的东西。