【问题标题】:Custom parser for HTML5 and other languagesHTML5 和其他语言的自定义解析器
【发布时间】:2012-08-31 02:32:22
【问题描述】:

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

【问题讨论】:

    标签: html parsing token lexical-analysis


    【解决方案1】:

    如果这纯粹是为了您自己的解析方面的教育,我建议使用比 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 和解析代码。

    【讨论】:

    • 感谢您的回答。这只是教育。如果你需要访问这个网站来询问关于你在工作中构建的东西的基本问题,你可能应该辞职。将两者分开对我来说听起来不错。我想我只需要制作适用于所有人的令牌类别,即使其中一些不会用于某些目的 - 例如,我想不出 HTML 中以数字开头的单个令牌,尽管 JavaScript变量值可能。我不必与网络相关才能保持兴趣,但为 C# 制作解析器听起来要困难得多,而且我从未听说过 SASS。
    【解决方案2】:

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

    它深入涵盖了词法分析、解析和解释。它仅涵盖 Javascript 的一个子集,因此您在完成课程后还有进一步的开发空间,但您将掌握一般结构和概念。

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

    【讨论】:

    • 酷,关于构建网络浏览器的课程。听起来很有趣也很有挑战性。
    猜你喜欢
    • 2012-03-16
    • 2018-12-15
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多