左递归语法中查找第一个和后面的混乱

raj*_*mar 6 compiler-construction recursion parsing automata pushdown-automaton

最近我遇到了先查找后跟踪的问题

S->cAd
A->Ab|a
Run Code Online (Sandbox Code Playgroud)

在这里,我对 A 的第一个感到困惑,哪个是正确的 {a} , {empty,a} ,因为 A 的产生式中存在左递归。我很困惑是否在 A 的第一个中包含空字符串 任何帮助将不胜感激。-------------已编辑----------------

第一个和接下来的是什么,,这是我见过的如此令人困惑的语法

S->SA|A
A->a
Run Code Online (Sandbox Code Playgroud)

我需要使用解析表证明这个语法不在 LL(1) 中,但无法做到,因为我没有在单个单元格中获得 2 个条目。

Am_*_*ful 2

首先,您需要删除导致的左递归

S -> cAd
A -> aA'
A' -> bA' | epsilon
Run Code Online (Sandbox Code Playgroud)

然后,你可以计算

FIRST(A) = a         // as a is the only terminal nderived first from A.
Run Code Online (Sandbox Code Playgroud)

EDIT :-

对于你的第二个问题,

S -> AS'
S' -> AS' | epsilon
A -> a

FIRST(A) = a
FIRST(S) = a
FIRST(S') = {a,epsilon}.
Run Code Online (Sandbox Code Playgroud)

在计算之前去除左递归的思想FIRST()可以在这里FOLLOW()学习。