compiler-construction - 编译器: How to define this grammar?

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

我必须为我正在创建的某些编译器编写语法: 二元运算符 &&|| 以及一元运算符 #* 的方式是:

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

会不会搞错了? 有什么想法吗?

最佳答案

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

因此,您希望拥有一堆 &&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

最后,最先例的是括号,这就好像你有一个牢不可破的 token 。除此之外,括号内可以有任何表达式:

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

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

关于compiler-construction - 编译器: How to define this grammar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12264411/

相关文章:

c++ - 包含新 ID 是否需要重新编译?

language-agnostic - 什么是 lambda ?

java - 编译语言与解释语言

c++ - 为什么在 stdafx.h 中不需要 header 保护?

c++ - 如何获取LLVM中指令引用的所有全局变量?

java - 在PHP中获取Java编译错误

c - ELF文件在嵌入式系统中的使用?

c++ - 为什么允许在 noexcept 标记的函数中抛出异常?

synchronization - 分布式客户端之间同步状态的方式

c - heartbleed bug 是 C 中经典缓冲区溢出漏洞的表现吗?