Skip to content

army8735/homunculus

Repository files navigation

A lexer&parser by Javascript

homunculus取自钢之炼金术师中的人造人,英语亦作小矮人,意指底层基石再造。

NPM version Build Status Coverage Status Dependency Status

INSTALL

npm install homunculus

使用说明

  • 解析语法并返回语法树和此法单元序列。
  • CommonJS/AMD/CMD自适应。

API

Homunculus

  • getClass(type:String, lan:String):class
    • type:
      • lexer
      • parser
      • node
      • context
      • token
      • rule
      • walk
    • lan:
      • js
      • javascript
      • es
      • es5
      • es6
      • es7
      • es2015
      • es2016
      • ecmascript
      • as
      • actionscript
      • css
      • html
      • htm
      • jsx
      • csx
  • getLexer(lan:String):lexer/Lexer
  • lan:
    • js
    • javascript
    • es
    • es5
    • ecmascript
    • es6
    • es7
    • es2015
    • es2016
    • as
    • actionscript
    • css
    • java
    • c++
    • cpp
    • cplusplus
    • html
    • htm
    • jsx
    • csx
  • getParser(lan:String):parser/Parser
    • lan:
      • js
      • javascript
      • es
      • es5
      • ecmascript
      • es6
      • css
      • html
      • htm
      • jsx
      • csx
  • getContext(lan:String):parser/Context
    • lan:
      • js
      • javascript
      • es
      • es5
      • ecmascript
      • jsx
      • csx
  • reset():void 重置Token的tid

lexer/Lexer

方法

  • constructor(Rule:lexer/rule/Rule) 传入语法规则Rule
  • parse(code:String):Array<lexer/Token> 传入代码并返回解析后的此法单元token列表
  • tokens(plainObject:Boolean = false):Array<lexer/Token> 返回已解析好的此番单元token列表,如果plainObject为true则传回普通对象
  • cache(line:init):void 设置缓冲解析行,每次最多解析几行代码,防止code过大卡死
  • finish():Boolean 设置cache有用,当前是否解析完毕
  • line():int code有多少行
  • col():int code最大列是多少

静态属性

  • STRICT: 0 严格模式语法错误后抛出异常
  • LOOSE: 1 宽松模式错误后忽略
  • mod(type:int):int 读取/设置模式

parser/Parser

方法

  • constructor(lexer:Lexer) 传入词法分析器
  • parse(code:String):Node 传入代码解析并返回语法树
  • ast(plainObject:Boolean = false):Node 返回已解析好的语法树,如果plainObject为true则传回普通对象
  • ignore():Object 返回解析中被忽略掉的空白注释等内容

lexer/Token

方法

  • constructor(type:int, content:String, val:String, sIndex:int) 构造函数传入token的类型、内容、字面内容和在代码中的开始字符索引
  • type(t:int):int 读取/设置类型
  • content(c:Stirng):String 读取/设置内容
  • val(v:String):String 读取/设置字面内容,字面内容不同于内容之处在于是否包含引号
  • tag(t:int):String 读取/设置类型,返回的是类型额字符串形式
  • tid(t:int):int 读取/设置token索引,默认所有token自增形式添加索引
  • sIndex(i:int):int 读取/设置token在code中的字符索引
  • isVirtual():Boolean 返回此token是否是虚拟不存在的
  • line():int 此token位于多少行
  • col():int 此token位于多少列

静态属性

  • type(t:int):String 返回类型的字符串形式
  • reset():Void 重置tid

parser/Node

方法

  • constructor(type:String, children:Node/Array<Node> = null) 传入类型和子节点
  • name(t:String):String 读取/设置节点类型
  • leaves():Array<Node> 返回子节点列表
  • leaf(i:int):Node 返回第i个子节点
  • size():int 返回有几个子节点
  • first():Node 返回第一个子节点
  • last():Node 返回最后一个子节点
  • isEmpty():Boolean 返回是否没有子节点
  • add(...node:Node):void 添加若干个子节点
  • token():Token 实际同leaves()一样,不过当name()为Token时children存储的是终结符Token
  • isToken():Boolean 返回此节点是否是Token节点
  • parent():Node 返回父节点
  • prev():Node 返回兄弟前一个节点
  • next():Node 返回兄弟后一个节点

lexer/rule/Rule

方法

  • constructor(keyWords:Array<String>, supportPerlReg:Boolean = false) 关键字列表和是否支持perl风格的正则表达式
  • addKeyWord(kw:String):Object 添加未知关键字并返回关键字hash,仅限此次对象分析

util/walk

方法

  • simple(node:Node, nodeVisitors:Object, tokenVisitors:Object) 遍历语法树工具。nodeVisitors以树节点名做键,回调做值,回调参数为树节点;tokenVisitors以token类型做键,回调做值,回调参数为token
  • simpleIgnore(node:Node, ignore:Object, nodeVisitors:Object, tokenVisitors:Object) 同上,增加第2个参数为忽略掉的空白符等。tokenVisitors的回调增加第2个参数为此token后面的忽略的token数组
  • recursion(node:Node, callback:Function) 递归工具,深度遍历语法树,回调每个节点。回调参数第1个为节点或者token,第2个参数标明是否是token
  • plainObject(node:Node):Array 序列化语法树结果为普通类型
  • plainObject(tokens:Array<Token>):Array 序列化tokens结果为普通类型

特别的,对于css还可以设置添加属性和颜色别名

  • addValue(v:String):Object 添加未知属性并返回属性hash,仅限此次对象分析
  • addColor(c:String):Object 添加未知颜色并返回颜色hash,仅限此次对象分析

亦可使用静态方法统一添加关键字等,一劳永逸

  • addKeyWord(kw:String):Array<String>
  • addValue(v:String):Array<String>
  • addColor(c:String):Array<String>

AST

当调用语法分析器解析后,会返回生成ast,这是一个树状数据结构,每个节点都是对应语法解析器目录下的Node.js的实例。
demo目录下是一个用js的parser分析输入js代码并画出ast形状的页面。
你也可以在线尝试它:http://army8735.me/homunculus

License

[MIT License]