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

HTML5和其他语言的自定义解析器,html,parsing,token,lexical-analysis,Html,Parsing,Token,Lexical Analysis,我正试图为(X)HTML5和任何可能嵌入的东西(EcmaScript,CSS)编写自己的自定义解析器(用C#),只是为了学习和享受乐趣。虽然我是一名中级程序员,但我对解析器和所有技术知识知之甚少。我可以很容易地为HTML5创建一个词法分析器(tokeniser),但是语法分析(解析)有点棘手。我不确定我是否应该首先对所有的源输入进行词汇分析,然后再进行另一种分析,或者同时尝试两种方法;获取char,直到我有了一个标记,意识到该标记的语法含义,然后期待与前一个标记相关的某个标记。我面临的问题是,H

我正试图为(X)HTML5和任何可能嵌入的东西(EcmaScript,CSS)编写自己的自定义解析器(用C#),只是为了学习和享受乐趣。虽然我是一名中级程序员,但我对解析器和所有技术知识知之甚少。我可以很容易地为HTML5创建一个词法分析器(tokeniser),但是语法分析(解析)有点棘手。我不确定我是否应该首先对所有的源输入进行词汇分析,然后再进行另一种分析,或者同时尝试两种方法;获取char,直到我有了一个标记,意识到该标记的语法含义,然后期待与前一个标记相关的某个标记。我面临的问题是,HTML可能嵌入了其他语言,如CSS和JavaScript,据我所知,它们将具有不同类别的标记,因此我不确定如何在标记代码时“知道”我在代码中的位置,以便对标记“是”有不同的定义。有什么想法吗?另外,先进行词汇分析,然后再进行语法分析,与同时进行这两种分析相比,有哪些优点/缺点?

如果这纯粹是为了你自己的语法分析教育,我建议你使用一个比HTML小得多/容易得多的字段,CSS和JS解析(如HTML和JS)都代表了一些非常棘手的解析问题,即使是最有经验的解析器编写人员也会感到紧张

基于Scheme或Basic的语言可能是我的首选。 (我个人最喜欢的是在阅读过程中构建解析器/解释器)

(同样,挑选一份类似现代编译器设计的东西也不会有什么坏处:)

如果为了保持您的兴趣,它必须与web相关,我会尝试为一种较小的web相关语言(如sass())进行语法分析

另一方面,如果这是与工作相关的东西,您真的需要解析这些特定的东西,我建议您完全跳过编写您自己的解析器的工作,并使用Razor或Chromium库之类的工具

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

每一个问题本身都非常困难,如果不尝试“太聪明”,也不尝试将功能组合成单一扫描


在可能的情况下,我建议尽可能保持事物的高层次、抽象和“干净”。。。因此,构建一个专门用于词法分析的节点树和另一个用于语法分析的节点树。。。对于HTML、CSS和JS等组合语言,每种语言都有不同的AST和解析代码

有一门关于
Udacity
[1]的很棒的课程,叫做
编程语言
,它涵盖了HTML和Javascript处理的全部概念

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


[1]

谢谢你的回答。这只是教育。如果你需要到这个网站来问一些关于你在工作中建立的东西的基本问题,你可能应该辞职。把两者分开对我来说很好。我想我只需要创建一个适用于所有人的标记类别,即使其中一些标记不会用于特定目的——例如,我想不出HTML中有哪一个标记以数字开头,尽管JavaScript变量值可能是。我不必为了保持兴趣而与网络相关,但是为C#做一个解析器听起来要困难得多,而且我从来没有听说过SASS。酷,一门关于构建网络浏览器的课程。听起来很有趣,也很有挑战性。