ellios's blog

ellios's trivial story.

Coffeescript源码篇

| Comments

最近为了凑运费,买了本《深入浅出CoffeeScript》,本来只打算随便翻翻的,不过看了以后发现CoffeeScript还是满有意思的,于是决定好好研究下,这里分享下自己的学习过程。

Install

装之前需要提前装好node和npm(具体怎么装google之吧),node和npm装好后,执行下面的命令,就可以开始体验CoffeeScript了。

1
npm install -g coffee-script

Compile

简单的体验下后,对于它把那么灵活的语法转化为比较工整的JS语法有点小好奇,于是把它的源码clone出来,简单的研究了下。

先试着编译它的源码,编译的操作过程如下:

1
2
3
git clone git://github.com/jashkenas/coffee-script.git
cd coffee-script
bin/cake build:full

OK,编译很迅速,大家可以对源码做各种折腾了。


Jison

CoffeeScript的核心是一个编译器,它把符合CoffeeScript语法规则的文件转化为JS语法。而CoffeeScript又是利用Jison实现词法和语法的解析。CoffeeScript将语法规则都写到grammar.js文件里,然后利用Jison生成符合该语法规则的编译器。

只要写个简单的语法规则,就可以实现一个编译器,这东西太高级了,于是开始折腾Jison。它的网站上有很多例子,其中有一个生成计算程序的例子,我把它稍微缩减下,让+做-,-做+。

simple_cal.jison
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/* lexical grammar */
%lex

%%
\s+                   /* skip whitespace */
[0-9]+("."[0-9]+)?\b  return 'NUMBER';
"-"                   return '-';
"+"                   return '+';
<<EOF>>               return 'EOF';

/lex

/* operator associations and precedence */

%left '+' '-'

%start expressions

%% /* language grammar */

expressions
    : e EOF
        {typeof console !== 'undefined' ? console.log($1) : print($1);
         return $1;}
    ;

e
    : e '+' e
        {$$ = $1-$3;}
    | e '-' e
        {$$ = $1+$3;}
    | NUMBER
        {$$ = Number(yytext);}
    ;

体验下效果把,当执行7-3时,返回的却是10。

1
2
>> jison simple_cal.jison && echo "7-3" > 2 && node simple_cal.js 2
>> 10

再深入的原理,就要涉及编译原理的内容,那个东西偶学得可烂的,以后有时间再研究下把。

参考资料

Comments