ECMAScript のコードを字句解析するコンパクトなパーサーライブラリ、chiffon.js を書きました。
chiffon.min.js は、3KB ほどのサイズです(v1.2.0 現在)。
Chiffon はとにかくファイルサイズが軽いのが特徴です。
正規表現で一発解析してて、その正規表現が少し長くなっちゃってるため、これ以上なかなかファイルサイズが削れないです。
構文エラーなどあってもエラーを吐かずに解析を続けます。
esprima ほど厳密ではないものの、ほとんどは esprima と同じ結果になります。
Parser と言ってますが、いまのところ Tokenize(字句解析) してるだけなので、厳密には Parser とは言わないのかもしれません。
※多少変化する可能性があります。最新の情報はこちらを参考ください
※JavaScript AST は現在サポートされてません。
minify は以下のような感じで単純に実装されてます。
chiffon.min.js は、3KB ほどのサイズです(v1.2.0 現在)。
特徴
- ライブラリのファイルサイズが軽い
- ECMAScript6 の仕様 を元にしてる
- 解析結果が esprima のtokenize結果と同じになる
- esprima ほど厳密ではない(構文エラーあっても解析を続けるなど)
- 速度は esprima と同じくらいかちょっと速い
- 正規表現で解析してる
Chiffon はとにかくファイルサイズが軽いのが特徴です。
正規表現で一発解析してて、その正規表現が少し長くなっちゃってるため、これ以上なかなかファイルサイズが削れないです。
構文エラーなどあってもエラーを吐かずに解析を続けます。
esprima ほど厳密ではないものの、ほとんどは esprima と同じ結果になります。
Parser と言ってますが、いまのところ Tokenize(字句解析) してるだけなので、厳密には Parser とは言わないのかもしれません。
使い方
ブラウザの場合:
<script src="chiffon.js"></script>
または、
<script src="chiffon.min.js"></script>
Chiffon
というオブジェクトがグローバルに定義されます。
Node.js の場合:
npm install chiffon
var Chiffon = require('chiffon');
bower:
bower install chiffon
tokenize
ECMAScriptのコード文字列をトークン化します。var tokens = Chiffon.tokenize('var a = 1');
console.log(tokens);
/*
[ { type: 'Keyword', value: 'var' },
{ type: 'Identifier', value: 'a' },
{ type: 'Punctuator', value: '=' },
{ type: 'Numeric', value: '1' } ]
*/
返される結果のトークン名リスト:
- Comment
- LineTerminator
- Template
- String
- Punctuator
- RegularExpression
- Numeric
- UnicodeEscapeSequence
- Identifier
- Null
- Boolean
- Keyword
※多少変化する可能性があります。最新の情報はこちらを参考ください
※JavaScript AST は現在サポートされてません。
Options
- comment : trueにするとCommentトークンを残します (default=false)
- lineTerminator : trueにするとLineTerminatorトークンを残します (default=false)
untokenize
tokenize() で返されたトークンを文字列に戻します。var tokens = Chiffon.tokenize('var a = 1');
var code = Chiffon.untokenize(tokens);
console.log(code); // 'var a=1'
minify
JavaScriptのコードを minify します。var min = Chiffon.minify('var a = 1 + 1; // comment');
console.log(min); // var a=1+1;
minify は以下のような感じで単純に実装されてます。
function minify(code) {
return untokenize(tokenize(code));
}
0 件のコメント:
コメントを投稿