HTML5和其他语言的自定义解析器

时间:2012-08-31 02:32:23

标签: html5 parsing token lexical-analysis

我正在尝试为(X)HTML5以及可能嵌入的任何内容(EcmaScript,CSS)编写我自己的自定义解析器(在C#中) - 只是为了学习和玩得开心。虽然我是一名中级程序员,但我对解析器和所有技术内容并不了解。我能够很容易地为HTML5创建一个词法分析器(tokeniser),但语法分析(解析)有点棘手。我不确定我是否应首先对所有源输入进行词法分析,然后再做其他输入或同时尝试两者;获取char直到我有一个令牌,实现令牌的共同意义,然后期望某个令牌与前一个令牌相关。我面临的问题是HTML可能嵌入了其他语言,如CSS和JavaScript,据我所知,它们会有不同类别的标记,所以我不知道如何“知道”我在哪里代码,因为我对它进行了标记,以便对标记“是”进行不同的定义。有什么想法吗?另外,首先进行词法分析然后进行语法分析与同时进行两者兼有有什么好处/缺点?

2 个答案:

答案 0 :(得分:2)

如果这纯粹是为了你自己关于解析的教育,我会建议使用比HTML,CSS和JS解析更小/更容易的字段,因为HTML和JS都代表了一些非常讨厌的解析问题,即使是最有经验的解析器编写者也是如此会觉得很紧张。

基于Scheme或Basic的语言可能是我的第一个选择。 (个人最喜欢的是在我通过http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html时建立解析器/解释器)

(同样拿起像现代编制者设计这样的东西副本可能不会受到伤害:http://www.amazon.com/Modern-Compiler-Design-D-Grune/dp/0471976970

如果必须与网络相关以保持您的兴趣,我会尝试使用较小的网络相关语言(例如sass(http://sass-lang.com

执行解析器

另一方面,如果这是与您真正需要解析这些特定事物相关的工作,我建议完全省略编写自己的解析器并加入Razor或Chromium库之类的工作。

至少直接回答你问题的后半部分:我建议总是尽可能地将解析/解释的各个阶段分开。

每个问题都很困难,而不是试图“太聪明”并试图将功能组合成一次扫描。

尽可能我建议尽可能保持高级,抽象和“干净”的东西......从而构建一个专门用于词法解析的节点树和另一个用于语法分析的节点...并且在组合的情况下语言为HTML,CSS和JS,每种语言都有不同的AST和解析代码。

答案 1 :(得分:0)

Udacity [1]上有一个名为Programming Languages的精彩课程,涵盖了HTML和Javacript处理的完整概念。

它深入介绍了词法分析,解析和解释。它只涵盖了Javascript的一个子集,因此您在完成课程后还有进一步的开发,但您将获得一般结构和概念。

[1] http://www.udacity.com/overview/Course/cs262/CourseRev/apr2012