编译器设计中LR解析器的组成部分是什么?


LR解析器是一种自下而上的解析器,用于解析上下文无关文法。LR解析也称为LR(K)解析。LR解析器是一种移进-规约解析器,它利用确定性有限自动机,通过从下往上读取栈来识别所有适用的前缀。

它决定是否存在可用的句柄。右句型的可行前缀是指包含句柄但不包含句柄右侧任何符号的前缀。因此,如果构造了一个识别右句型可行前缀的有限状态机,则可以使用它来指导移进-规约解析器中的句柄选择。

LR解析器栈包含两种类型的符号——状态符号可以识别DFA的状态和语法符号。解析器从DFA的初始状态I0开始,位于栈顶。解析器通过考虑下一个输入符号'a'和栈顶的状态符号Ii来运行。

LR解析器有以下几个组成部分。

  • 输入缓冲区——它包含要解析的字符串,后跟$,这是一个用作字符串右端标记的符号,表示字符串的结尾。
  • ——它用于存储语法符号和状态。

         s0X1s1X2……………………Xmsm$

       其中X1, X2……………….Xm是语法符号

       而s0, s1, s2………………..sm是状态

  • 分析表:分析表分为两个部分——
    • 动作:动作可以是移进、规约、接受和错误。
    • goto:它以状态和语法符号为参数,并产生一个状态示例,goto(s, X)。
  • 分析程序:这是一个驱动程序,执行以下功能
    • 它维护初始配置(s0,w$),其中s0是起始状态,w是字符串。
    • 它支持以下配置
    • s0X1s1X2 … … XmSm, ai, ai+1 … … an$
           栈           输入字符串(w)

    • 它确定Sm(当前位于栈顶的状态)和ai(当前输入符号)。
    • 它根据分析表中的条目action[Sm,ai]采取动作。
  • 动作——解析器采取的动作有以下几种类型:
  • 移进——如果Action[Sm, ai] = shift s,则将ai与状态s一起移入栈中,即配置变为。

  • 规约——如果Action[Sm, ai] = reduce A → β,则解析器执行规约,即配置变为。

              这里

                 s = goto[sm−r, A]

                 r = β的长度

弹出符号的数量 = 2r(r个状态符号 + r个语法符号)

  • 接受——如果Action[sm, ai] = accept,则解析完成。
  • 错误——如果Action[sm, ai] = error,则解析器调用错误校正函数。

更新于:2021年11月3日

958 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告