我正在尝试学习与编程语言相关的Chomsky Hierarchy的某些方面,我仍然需要阅读Dragon Book.
我读过大多数编程语言都可以解析为无上下文语法(CFG).就计算能力而言,它等于下推非确定性自动机之一.我对吗?
如果这是真的,那么CFG怎么能保持一个不受限制的语法(UG),这是完整的?我问,因为即使编程语言由CFG描述,它们实际上也用于描述图灵机,所以通过UG.
我认为这是因为至少有两个不同的计算级别,第一个,即CFG的解析侧重于与语言结构(表示?)相关的语法,而另一个侧重于语义(意义,解释)数据本身?)与编程语言的功能有关,这是完整的.再次,这些假设是对的吗?
programming-languages turing-machines context-free-grammar formal-languages chomsky-hierarchy
我正在努力学习如何制作编译器.为了做到这一点,我读了很多关于无上下文的语言.但是有一些我自己无法得到的东西.
因为它是我的第一个编译器,所以有一些我不知道的实践.我的问题是在构建一个解析器生成器,而不是编译器和lexer.有些问题可能很明显..
我的读物包括:自下而上的解析,自上而下的解析,正式的语法.显示的图片来自:Miscellanous Parsing.全部来自斯坦福CS143级.

以下是要点:
0)(模糊/明确)和(左递归/右递归)如何影响一种算法或另一种算法的需求?还有其他方法来限定语法吗?
1)模糊语法是具有多个解析树的语法.但是,最左推导或最右推导的选择是否应该导致解析树的单一性?
[编辑:在这里回答]
2.1)但是,与k相关的语法是否模糊?我的意思是给出一个LR(2)语法,对于LR(1)解析器是不明确的,对于LR(2)解析器是不明确的?
[编辑:不,不是,LR(2)语法意味着解析器将需要两个前瞻标记来选择正确的规则来使用.另一方面,模糊语法是可能导致多个解析树的语法.]
2.2)所以一个LR(*)解析器,只要你能想象它,根本就没有模糊的语法,然后可以解析整套无上下文语言?
[编辑:由Ira Baxter回答,LR(*)不如GLR强大,因为它无法处理多个解析树.]
3)根据以前的答案,以下内容可能是自相矛盾的.考虑到LR解析,模糊语法会引发shift-reduce冲突吗?一个明确的语法也会引发一个吗?以同样的方式,减少 - 减少冲突怎么样?
[编辑:就是这样,模糊的语法导致转移减少和减少 - 减少冲突.通过对立,如果没有冲突,语法是单义的.]
4)解析左递归语法的能力是LR(k)解析器优于LL(k)的优势,它们之间的唯一区别是什么?
[编辑:是的.]
5)给G1:
G1 :
S -> S + S
S -> S - S
S -> a
Run Code Online (Sandbox Code Playgroud)
5.1)G1是左递归,右递归和模糊,我是对的吗?它是LR(2)语法吗?人们会明白这一点:
G2 :
S -> S + a
S -> S - a
S -> a
Run Code Online (Sandbox Code Playgroud)
5.2)G2仍然含糊不清吗?G2的解析器是否需要两个前瞻?通过分解,我们有:
G3 :
S -> S V
V -> + a
V -> - a
S -> …Run Code Online (Sandbox Code Playgroud)