作家
登录

AST解析基础: 如何写一个简单的html语法分析库

作者: 来源: 2017-08-22 09:25:22 阅读 我要评论

'OpeningDoctype'
  •   OpeningNormalComment = 'OpeningNormalComment'
  •   InNormalComment      = 'InNormalComment'
  •   InShortComment       = 'InShortComment'
  •   ClosingNormalComment = 'ClosingNormalComment'
  •   ClosingTag           = 'ClosingTag'
  • 全部解析采取函数式编程, 没有应用OO, 为了简化在函数间传递状况参数, 因为是一个同步操作,

    这里应用了JavaScript的事宜模型, 采取全局变量来保存状况. Token分析时所须要的全局变量列表如下:

    1. let state: State          // 当前的状况 
    2. let buffer: string        // 输入的字符串 
    3. let bufSize: number       // 输入字符串长度 
    4. let sectionStart: number  // 正在解析的Token的肇端地位 
    5. let index: number         // 当前解析的字符的地位 
    6. let tokens: IToken[]      // 已解析的token列表 
    7. let char: number          // 当前解析的地位的字符的UnicodePoint 

    在开端解析前, 须要初始化全局变量:

    1. function init(input: string) { 
    2.   state        = State.Literal 
    3.   buffer       = input 
    4.   bufSize      = input.length 
    5.   sectionStart = 0 
    6.   index        = 0 
    7.   tokens       = [] 

    然后开端解析, 解析时须要遍历输入字符串中的所有字符, 并根据当缁ご态进行响应的处理

    (改变状况, 输出token等), 解析完成后, 清空全局变量, 返回停止.

    1. export function tokenize(input: string): IToken[] { 
    2.   init(input) 
    3.   while (index < bufSize) { 
    4.     char = buffer.charCodeAt(index
    5.     switch (state) { 
    6.     // ...根据不合的状况进行响应的处理 
    7.     // 文┞仿忽视了对各个状况的处理, 具体懂得可以查看源代码 
    8.     } 
    9.     index++ 
    10.   } 
    11.   const _nodes = nodes 
    12.   // 清空状况 
    13.   init(''
    14.   return _nodes 

    时避免高低文处理, 并简化状况机状况表. 状况列表如下:

    语法树解析

    因为状况完全可以经由过程正在解析的节点的类型来断定。

    不太多解释, 可以到GitHub查看源代码.

    结语


      推荐阅读

      传统IT七大职业的云计算转型之路

    【51CTO晃荡】8.26 带你与清华大年夜学、搜狗、京东大年夜咖们一路商量基于算法的IT运维实践 对于体系治理员来说,云职业之路要大年夜转移到云运算,做一名cloudop开端。这是云运算中的一>>>详细阅读


    本文标题:AST解析基础: 如何写一个简单的html语法分析库

    地址:http://www.17bianji.com/lsqh/36839.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)