主要观点:
- 作者在大学独立学习编程语言时接触到解析理论,对 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 解析器能在语法中支持丰富的操作符和继承属性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。