今天看到wiki上说手动编写LR编译器非常困难,一般都是由生成器自动生成。就想试一把,找了一个最简单的上下文无关文法,写了个小程序。可能因为我选的文法太简单了吧,发现写LR编译器也没有那么困难。接下来准备挑战一个相对比较复杂的编程语言。
文法:
G = (V,E,R,S)
V = {S,+}
E = {1,a}
R =
{
S->S+S
S->1
S->a
}
S = {S}
伪码:
判断待编译字符串是否已为终结符,成立则结束运行
逐条尝试所有规则,若某条匹配则应用该条规则并停止尝试其余规则,应用结束后继续处理余下字符串
主要代码:
(没有优化,主要是为了体现LR编译器的原义)