parsing - 如何找到递归语法的第一组
问题描述
我有一个语法:
S → SL | ε
L → A; | E; | C;
E → (EBE) | N | V
A → let V =E
C → while E do S | while E do S else S
B → + | - | * | >
V → x | y | z
N → ND | N0 | D
D → 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
我正在尝试为我构建解析表,以便能够证明它不是 LL(1) 语法。我目前无法找到 S 的 FIRST 集合。我一直在集合中获得 S,无法到达 G 的终端。 FIRST(SL) 会是什么?
当我执行 FIRST(SL) 时,我会不断回到 FIRST(S),然后 FIRST(SL) ⋃ FIRST(ε) = FIRST(S) ⋃ {ε},然后 FIRST(S) 会重复一遍和结束。
解决方案
大写字母代表非终结符。小写字母代表终端。
First 和 Follow 是在终结符或非终结符之前或之后的 TERMINAL 符号(在分析树的前序遍历中)。
For all A -> xYZ
First (A) = {x}
For all A-> Xyz
First (A) = First(X)
For all A-> εYZ
First (A) = First(Y)
取所有这些终端符号的并集。
推荐阅读
- linux - Linux:不可执行的安装文件
- reactjs - 从反应开关元素更新弹簧数据库
- java - 捆绑 JRE 8 和 JavaFX 应用程序
- ruby - 浮点异常:ruby sinatra 上的 8 与 ibm_db gem
- sql-server - 为什么当查询以 '\2\' 开头时,LIKE 过滤器没有命中索引
- python - 有一个 numpy.dot 文档示例不清楚
- apache-nifi - 如何在 Nifi 中测量总执行时间
- aws-lambda - 如何使用 Cloud Watch 事件将在 AWS Glue 作业中处理后的 S3 输入文件名(S3 文件)发送到 AWS Lambda?
- android - 如何定期执行 android 位置检查?
- android - 如何使用短信组件记录号码和短信?