compiler-construction - 如何留下上下文无关语法的因素?

标签 compiler-construction grammar ll

据我了解,在以下情况下,需要使用左分解来构建自上而下的解析器。
但很难理解如何做到这一点?有人可以在这里帮助我吗?谢谢。

s = a | b
b = c d
c = (e | f) g
e = a | h

最佳答案

每个非终结符在这里只被引用一次,所以我们可以把整个语法放在一个表达式中:

s = a | ((a | h | f) g d)

所以我们有两个基本的变体,终端 a 可选地后跟 g 然后 d,或者 h 或 f 之一总是后跟 g 然后 d。

所以我们有
s =  b' | c'
b' = a | a g d
c' = (h | f) g d

或者,将常见的 g d 序列拉入自己的生产中
s =  b' | c'
b' = a | a e'
c' = (h | f) e'
e' = g d

然后我们可以通过引入 E(空)选项将 a 作为 b' 中的常见起始符号:
s =  b'' | c'
b'' = a (e' | E)
c' = (h | f) e'
e' = g d

语法现在是明确的。

关于compiler-construction - 如何留下上下文无关语法的因素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9540117/

相关文章:

haskell - 使用构造函数的一部分在 Haskell 数据中派生实例

c - 以编程方式生成 C Win32 DLL

assembly - 将 AST 编译为汇编

javascript - 为 jison 生成的 css präprozessor 语言定义导入语句的语法

python - 如何删除每个非字母字符的单词

parsing - 解析器的性能 : PEG vs LALR(1) or LL(k)

compiler-construction - C++/CLI 数组初始值设定项编译错误

python - 解析 HTSQL 时处理语法歧义

python - 能否修改 ANTLR 语法文件以供 PLY 使用?

ANTLR:回溯和前瞻的区别?