https://github.com/discretetom/left-recursion-killer
大三 - 编译原理 - 左递归消除程序
https://github.com/discretetom/left-recursion-killer
Last synced: about 2 months ago
JSON representation
大三 - 编译原理 - 左递归消除程序
- Host: GitHub
- URL: https://github.com/discretetom/left-recursion-killer
- Owner: DiscreteTom
- License: mit
- Created: 2018-10-29T10:51:32.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2018-11-04T13:45:20.000Z (over 6 years ago)
- Last Synced: 2025-02-05T06:38:58.114Z (4 months ago)
- Language: C++
- Size: 7.81 KB
- Stars: 3
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# left-recursion-killer
大三 - 编译原理 - 左递归消除程序
## 算法
修正课本P29页的算法如下:
```c++
把文法G中的所有非终结符号排序为A1, A2, ..., An
for (i = 1; i <= n; ++i){
消除Ai产生式中的直接左递归
for (j = 1; j <= i - 1; ++j){
if (Aj -> δ1 | δ2 | ... | δn是当前关于Aj的所有产生式){
if (存在形如Ai -> Ajγ的生成式){
把每个形如Ai -> Ajγ的产生式改写为Ai -> δ1γ | δ2γ | ... | δnγ
}
消除Ai产生式中的直接左递归
}
}
}
// 化简文法,去除无用的非终结符和产生式
```## 如何使用
输入要求:
- 输入的文法无环路
- 输入的文法无ε-产生式输入方式:
- 直接拖拽文件或多个文件到可执行文件即可执行
- 也可以直接双击启动可执行文件再手动输入生成式,输入空行表示结束输入格式:
- 解析时会忽略所有空格和制表符,所以如果为了美观可以添加任意数量的空格和制表符
- 每行只能有一个非终结符的生成式,但是生成式可以有多个候选式。候选式使用`|`分隔
- 允许一个非终结符有多行生成式
- 单个非终结符以大写字母开头,后面可以接任意个英文单引号`'`
- 生成式的左侧只能有一个非终结符,此非终结符后面必须有箭头`->`。
- 只识别每行的第一个箭头`->`,同一行后面还有箭头会视为终结符
- 字符`~`表示ε,即空串
- 上面没有提到的可打印符号均可作为终结符。终结符后面可以接任意个英文单引号`'`
- 根据上面的规则,如果不想让`~`表示空串,可以加一个英文单引号用`~'`表示输出局限:
- 没有去除无用的非终结符和产生式
- 不能判断错误输入或不需要消除左递归的输入