黄龙

2015-09-22 22:30

PEG.js学习笔记

本文作者:IMWeb 黄龙 原文出处:IMWeb社区 未经同意,禁止转载

PEG.js可以做什么?

PEG.js 是一个JavaScript的表达式语法解析器,它使您能够轻松地建立复杂的数据或计算机程序语言的快速分析器。

安装

Node.js

npm install -g pegjs

Browser

bower install pegjs

生成解析器

pegjs xxx.pegjs

文法定义和语义

上面的都没有什么卵用。我们能拿它来干啥?写一个简单的lambda表达式练手吧

lambda
    = left:exp1 "=>" right:exp2 { return new Function(left,"return "+right);}

var "变量"
    = strs:[a-zA-Z0-9]+ { return text(); }

exp1 "左侧表达式"
    = var ("," var)* {return text();}

exp2 "右侧表达式"
    = .+ {return text();}

保存为lambda.pegjs

pegjs lambda.pegjs

就会生成一个lambda.js的文件 在node里面我们就可以这样使用它

var lambda = require("./lambda");
var func=lambda.parse("a,b,c=>a+b+c;");
console.log(func(2,4,4)); //10

//例子:查找数组中大于3小于9的所有数的和
var lp=lambda.parse
    ,arr=[9,2,4,6,7,8,1,0]
    ,sum=0;

//lambda表达式写成一行
sum = arr.filter(lp(" a =>a>3&&a<9")).reduce(lp(" a ,b ,c ,d=> a + b"));
console.log(sum);//25

//标准写法
sum = arr.filter(function(a){
    return a>3&&a<9;
}).reduce(function(a,b,c,d){
    return a+b;
});
console.log(sum);//25

由于PEG.js的中文文档不多,学习起来还是挺费劲的。总结了几个规律仅供参考。

  1. a:b 表达式 可以理解为取别名 在后面a就可以替代b
  2. text()方法 取值
  3. \ 表示或者
  4. "xxx" 是描述信息,当你写的字符串不符合文法定义的时候,会根据描述信息生成对应的错误

后续会继续更新。

2条评论

    您需要 注册 一个IMWeb账号或者 才能进行评论。