mrj*_*min 6 parsing context-free-grammar formal-languages automata-theory
我很难理解LR(1)中的前瞻原则 - 项目.如何计算先行集?
举个例子说我有以下语法:
S -> AB
A -> aAb | b
B -> d
Run Code Online (Sandbox Code Playgroud)
然后第一个状态将如下所示:
S -> .AB , {look ahead}
A -> .aAb, {look ahead}
A -> .b, {look ahead}
Run Code Online (Sandbox Code Playgroud)
我知道前方是什么,但我不知道如何计算它们.我搜索了答案,但找不到一个简单解释这个问题的网页.
提前致谢
And*_*den 14
我将为你的例子写下前两个状态:
S -> AB
A -> aAb | b
B -> d
Run Code Online (Sandbox Code Playgroud)
(1) S -> .AB, {$} # Once we have done this rule it's EOF ($)
(2) A -> .aAb, {d} # from (1), after A there has to be a B whose first symbol has to be d
(3) A -> .b, {d} # as above
Run Code Online (Sandbox Code Playgroud)
(4) A -> a.Ab, {d} # from (2)
(5) A -> .aAb, {b} # from (4), the symbol after the A has to be b
(6) A -> .b, {b} # from (4), as above
(7) A -> b., {d} # from (3)
(8) S -> A.B, {$} # from (1) and (7)
(9) B -> .B, {$} # from (8)
Run Code Online (Sandbox Code Playgroud)
等等,保持跟LR(0)解析器一样的shift/reduce/closure,但跟踪(lookahead)下一个符号...
(状态2+更长,我不建议用手工作!)
我建议查看Udacity的编程语言课程,以了解有关lexing和解析的更多信息.维基百科上还有一个例子和相关的SO问题.
| 归档时间: |
|
| 查看次数: |
6273 次 |
| 最近记录: |