LL 与 LR 解析揭秘

主要观点:

  • 作者在大学独立学习编程语言时接触到解析理论,对 LL、LR 等算法着迷,多年后对这些算法有了深入理解且思考方式与文献不同,从实现角度看待更多。
  • 本文从黑盒视角探讨解析器,先介绍波兰和逆波兰记法,其无需括号和运算顺序规则,更易编写求值器,类似 Lisp 的 s-表达式可避免固定操作数问题,且与 LL、LR 解析相关。
  • 解析器输出是解析树遍历,LL 解析器输出前序遍历,LR 解析器输出后序遍历,与传统解释不同但更直观,如算术表达式树的三种遍历对应不同记法。
  • 用 JSON 语法举例说明实际的解析树,LL 和 LR 解析器都是读取输入令牌流并在适当位置插入规则以实现遍历,将解析器输出用波兰和逆波兰记法建模更简单。
  • LL 和 LR 解析器是“在线”的,会向前看以确定插入规则,LR 解析器有优势,因为能看到更多规则信息,所以 LR 解析器能处理更多语法,包括左递归,而 LL 解析器能在语法中支持类似正则表达式的操作符和继承属性。

关键信息:

  • 介绍了波兰和逆波兰记法及其与解析的关系。
  • 明确解析器输出是解析树遍历及 LL、LR 解析器输出的差异。
  • 用 JSON 语法举例说明解析树及 LL、LR 解析器的工作过程。
  • 阐述了 LL 和 LR 解析器在处理语法等方面的优势和差异。

重要细节:

  • 波兰记法是将运算符放在操作数之前,逆波兰记法是将运算符放在操作数之后。
  • 解析器输入是令牌流,输出是解析树遍历,如 LL 输出前序遍历,LR 输出后序遍历。
  • 不同记法对应不同的树遍历方式,如中缀、前缀、后缀。
  • LR 解析器在向前看方面有优势,能看到更多规则信息,可处理更多语法。
  • LL 解析器能在语法中支持丰富的操作符和继承属性。
阅读 16
0 条评论