grammar - 将 BNF 文法转换为 JavaCC
问题描述
我使用 BNF 语法编写了以下 JavaCC 代码:
TOKEN: {
<NEXPR: <NTERM> ((<ADD> | <SUB>) <NTERM>)*> |
<NTERM: <NFACTOR> ((<MUL> | <DIV>) <NFACTOR>)*> |
<NFACTOR: (<SUB>)? (<DIGIT> | <REPCOUNT> | <PARAMETER> | <LPAR> <NEXPR> <RPAR>)>
}
我从 javacc 收到一个错误:
检测到正则表达式中的循环:“...NEXPR...--> ...NTERM...--> ...NFACTOR...--> ...NEXPR...”
我认为我的语法不是左递归,无论如何,我读到 JavaCC 不支持左递归语法,所以我需要将该代码转换为右递归。现在我知道了以下原理:
这个语法(左递归)
X -> Xa | b
变为(右递归):
X -> bX'
X' -> aX' | {}
或(适应 JavaCC 情况)
X -> b(a)*
但我不知道如何转换我的示例,因为它是由三个规则组成的。你能帮我吗?初始语法(BNF 形式):
NExpr = NTerm { ( "+" | "-" ) NTerm }
NTerm = NFactor { ( "*" | "/" ) NFactor }
NFactor = "-" ( Number | REPCOUNT | Parameter | "(" NExpr ")" ) |
Number | REPCOUNT | Parameter | "(" NExpr ")"
解决方案
推荐阅读
- vue.js - 带有 JWT 的 Vue SPA 多个选项卡(令牌过期)
- mysql - 如何使用 Express.js 和 MySQL 为每首歌曲创建具有唯一 URL 的单个 html 链接?
- vim - vim 作为 mutt 的编辑器:指定在标题下打开换行符作为命令行选项
- r - 如何表示线性回归模型的结果?
- python-3.x - 如何修改代码以便可以读取多个图像并将其存储在一个数组中?以便它们用于 LSB 隐写术
- php - 使用多个用户选择从数据库中过滤数据
- reactjs - 如何使用 React Router 参数更新子组件中的状态?
- artifactory - 我的远程仓库没有错误,但也没有内容
- c# - 创建异步流源
- python - 尝试在 python 中使用 tika 解析一些文本时出现 504 错误