【问题标题】:Compilers: How to define this grammar?编译器:如何定义这个语法?
【发布时间】:2012-08-29 04:01:44
【问题描述】:

我必须为我正在创建的一些编译器做一个语法: 二元运算符 &&|| 和一元运算符 #* 以它们的方式:

I) || 优先于 &&
II) && 关联到左边:a && b && c 表示 ((a&&b)&&c)
III) || 右关联
IV) 一元运算符的优先级高于二元运算符

我在想这样的事情:

E -> E || T | E && T | T
T -> T # F | T * F
F -> (E) | Numbers
Numbers -> 0 | 1 | 2 | 3 | ... | 9

会错吗? 有什么想法吗?

【问题讨论】:

  • 语法是LL吗? LR?甚至没有上下文?
  • 这是大学的一个项目,我正在和我的教授一起工作,他把这个交给了研究,我开始学习编译器。

标签: compiler-construction compilation computer-science computer-architecture


【解决方案1】:

对于像这样的简单表达式,您总是可以从最低优先级开始。

所以你想要有一堆&&ed 表达式,每个都是||ed 相同先例的一元运算符的表达式。

在写下来之前,先看看这两条规则:

E -> E + T

E -> T + E

第一条规则使+ 左关联,而第二条规则使其右关联(考虑一下)。所以你希望你的 && 是左关联的,|| 是右关联的:

E -> E '&&' T | T         # left associative &&
T -> F '||' T | F         # right associative ||

一元运算符的规则相当简单:

F -> '#' F | '*' F | N    # apply unary operators without precedence from right to left

最后,最先例是括号,就好像你有一个牢不可破的令牌。除了,在括号内你可以有 any 表达式:

N -> '(' E ')' | number

number本身可以用正则表达式表示,如'[1-9][0-9]*'

【讨论】:

  • 非常接近,但看起来模棱两可...这如何优先 ||在 && ?
  • @nemo,对不起,|| 超过 && 太奇怪了,我是反过来写的!修好了。
  • 没有。您正在添加原始表达式中不存在的 ()。你正在做的是以你喜欢的方式生成解析树,而不是它的方式。
  • Valter,你应该知道解析树最终给了你相同的表达式,而不是带括号的东西。从树的 shape 中,您将了解首先评估的内容。
  • @Shahbaz,我重新制作了第二个案例并创建了另一个案例:i.imgur.com/o3Fuh.jpg
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 2021-12-07
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2014-06-28
  • 2011-01-20
相关资源
最近更新 更多