parsing - 如何在 LL(1) 解析器中处理运算符优先级
问题描述
我正在为表达式语法编写一个 LL(1) 解析器。我有以下语法:
E -> E + E
E -> E - E
E -> E * E
E -> E / E
E -> INT
但是,这是左递归,我使用以下语法删除了左递归:
E -> INT E'
E' -> + INT E'
E' -> - INT E'
E' -> * INT E'
E' -> / INT E'
E' -> ε
如果我有表达式1 + 2 * 3
,解析器如何知道在加法之前评估乘法?
解决方案
尝试这个:
; an expression is an addition
E -> ADD
; an addition is a multiplication that is optionally followed
; by +- and another addition
ADD -> MUL T
T -> PM ADD
T -> ε
PM -> +
PM -> -
; a multiplication is an integer that is optionally followed
; by */ and another multiplication
MUL -> INT G
G -> MD MUL
G -> ε
MD -> *
MD -> /
; an integer is a digit that is optionally followed by an integer
INT -> DIGIT J
J -> INT
J -> ε
; digits
DIGIT -> 0
DIGIT -> 1
DIGIT -> 2
DIGIT -> 3
DIGIT -> 4
DIGIT -> 5
DIGIT -> 6
DIGIT -> 7
DIGIT -> 8
DIGIT -> 9
推荐阅读
- xml - 避免使用powershell从xml文件中删除空行
- c# - 当我单击 Go to Declaration 时,如何直接下载源代码而不是反编译 .net core 的本地 .dll 文件?
- java - 一个参数的Java功能接口可以应用于无参数方法吗?
- java - 如何获取方法的返回值?
- amazon-web-services - 使用 Docker 登录登录 ECR 时出错:“保存凭据时出错...未实现”
- java - 反汇编 Java 的 Gist 的正确文件扩展名是什么?
- python - Python 代码的时间复杂度和空间复杂度
- json - 如何使用正则表达式解析这个 json: { "success" : true }?
- firebase - Firebase 托管的网站无法访问,浏览器警告“此网站无法提供安全连接”
- powershell - 使用范围重新创建 PowerShell 脚本块