context-free-grammar - 在 CFG 中实现中缀
问题描述
我有一个关于构建基本上下文无关语法的问题。我的语法旨在解析数学陈述。到目前为止我有这个:
E --> P
E --> E + P
P --> A
P --> P * A
A --> (E)
A --> n
我需要实现另一个非终结符 X,它代表中缀运算符 (^),意思是提升到一个权力。我不知道如何实现 X 以使其具有右关联性并且具有比 * 和 + 更高的优先级。我无法理解上述 CFG 如何强制 * 比 + 具有更高的优先级。对这两个问题的任何解释(在上述 CFG 中 * 如何优先于 + 以及如何正确实现 ^)将不胜感激。
解决方案
既不P
也A
不能生产x+y
。因此,必须比在or中*
更紧密地结合。+
x+y*z
z*x+y
同样,P
可以生产x*y
但A
不能。因此,鉴于匹配的产生式 is P*A
,唯一有效的解析x*y*z
是 is P => x*y; A => z
。这使得*
左联想。
如果你画一些语法树,这可能会变得更加清晰。
推荐阅读
- c# - 如何从 ActiveX 组件中保存位图
- pentaho - 基于用户登录,需要在 pentaho CDE 仪表板中更改数据源连接
- c++ - 在 C++ 中创建不可变且高效的类的惯用方法
- ios - 在两个不同的类中对同一文件使用委托
- mysql - 我的查询在 MySQL 工作台和 phpmyadmin 中有效,但在 node.js 中无效
- amazon-web-services - AWS 上的无服务器任务调度
- css - 是否可以将 css 变量保存到 scss 变量中?
- php - 无法使用 mysqli_fetch_assoc($result) 从数据库中获取
- php - PHP处理数据并创建数组
- javascript - Angular:如何防止组件模板同时闪烁两个条件语句?