A lexer&parser by Javascript
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
demo
lib
src
tests
web
.coveralls.yml
.gitattributes
.gitignore
.npmignore
.travis.yml
LICENSE
Makefile
README.md
gulpfile.js
index.js
package.json

README.md

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
  • 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
  • getParser(lan:String):parser/Parser
    • lan:
      • js
      • javascript
      • es
      • es5
      • ecmascript
      • es6
      • css
      • html
      • htm
      • jsx
  • getContext(lan:String):parser/Context
    • lan:
      • js
      • javascript
      • es
      • es5
      • ecmascript
      • jsx
  • 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]