我正在尝试为 (X)HTML5 和可能嵌入的任何内容(EcmaScript、CSS)编写我自己的自定义解析器(在 C# 中) - 只是为了学习和享受乐趣。虽然我是一名中级程序员,但我对解析器和所有技术知识了解不多。我能够相当容易地为 HTML5 创建一个词法分析器(tokeniser),但句法分析(解析)有点棘手。我不确定我是否应该首先对所有源输入进行词法分析,然后再做另一个,或者同时尝试两者;获取 char 直到我有一个令牌,意识到这个令牌在语法上的含义,然后期待一个与前一个令牌相关的某个令牌。我面临的问题是 HTML 可能嵌入了其他语言,例如 CSS 和 JavaScript,据我所知,它们会有不同类别的标记,所以我 我不确定如何“知道”我在代码中的位置,因为我对它进行标记以便对标记“是”有不同的定义。有什么想法吗?此外,先进行词法分析,然后再进行句法分析与同时进行两者的优缺点是什么?
2 回答
如果这纯粹是为了您自己的解析方面的教育,我建议使用比 HTML、CSS 和 JS 解析更小/更容易的领域,因为 HTML 和 JS 都代表了一些非常令人讨厌的解析问题,即使是最有经验的解析器编写者也会感到紧张应对。
基于 Scheme 或 Basic 的语言可能是我的首选。(个人最喜欢的是在我浏览http://mitpress.mit.edu/sicp/full-text/book/book-ZH-10.html时构建解析器/解释器)
(也拿起像现代编译器设计的副本可能不会受到伤害:http ://www.amazon.com/Modern-Compiler-Design-D-Grune/dp/0471976970 )
如果它必须与网络相关才能保持您的兴趣,我会尝试为您的解析器做一些较小的网络相关语言,例如 sass ( http://sass-lang.com )
另一方面,如果这与您确实需要解析这些特定事物的工作相关,我建议您完全跳过编写自己的解析器的工作,并挂钩到 Razor 或 Chromium 库之类的东西。
并至少直接回答您问题的后半部分:我建议始终将解析/解释的各个阶段尽可能地分开。
每个问题本身就足够困难,无需尝试“太聪明”并尝试将功能组合到一个单一的扫描中。
在可能的情况下,我建议尽可能保持高层次、抽象和“干净”……因此构建一个专门用于词法解析的节点树和另一个用于句法解析的节点树……在组合语言的情况下,如 HTML 、CSS 和 JS,每个都有不同的 AST 和解析代码。
Udacity
在[1]上有一个很棒的课程,Programming Languages
它涵盖了 HTML 和 Javacript 处理的完整概念。
它深入涵盖了词法分析、解析和解释。它仅涵盖 Javascript 的一个子集,因此您在完成课程后还有进一步的开发,但您将获得一般结构和概念。
[1] http://www.udacity.com/overview/Course/cs262/CourseRev/apr2012