Skip to content
This repository has been archived by the owner on Aug 30, 2019. It is now read-only.

akira-cn/jsypar

Repository files navigation

[安装和使用]
将lib目录下的文件copy到perl安装路径下的lib目录
运行命令 perl yaparse.pl examples/demo1/Demo1.ypj
切换到 examples/demo1/ 目录, 打开Demo1.html试试看

什么是YYParser?
-------------------------------------
YYParser是在Perl的Yapp基础上实现的基于JavaScript的LR(1)文法解析脚本生成器,这样说有一点点绕,但是实际上可以把它简单理解为yacc的Perl/JavaScript混合版,它生成的解释器代码是存JS的,但生成工具是一段Perl脚本。

YYParser的基本原理?
-------------------------------------
要理解YYParser的工作原理必须要有一点点DFA、LALR(1)、正则表达式方面的知识,如果完全不了解这些,建议温习一下编译原理。
YYParser是根据文法生成表驱动的LALR(1)分析算法,在设计文法表的时候,你可能需要一点点正则表达式的技巧。
不过ypj文件本身的格式并不复杂,通过参考例子,你应该能很容易地掌握它们的写法。

用YYParser能做什么?
-------------------------------------
任何人可以用它来快速生成一个JavaScript实现的LR(1)文法解释器,这样可以用很低的成本让你的前端脚本拥有LALR(1)算法解释不同语言文法的能力,比如用js去解释X-path,去分析bash文件或者去解释某些别的什么语言……

怎样用YYParser?
-------------------------------------
首先是确定你需要的文法,然后描述它,例如:
#Grammar rules A -> (A)|a
%%
A:  '(' A ')'	
    |   'a' 
;
%%
描述了一个极其简单的LR(1)文法,将这个文件保存为Demo1.ypj
接着你可以通过运行yyparse.pl脚本读取Demo1.ypj,生成Demo1.ypj.pm.js文件
> perl yyparse.pl Demo1.ypj (回车)
然后你就可以用YYParser.js和Demo1.ypj.pm.js去解释满足上面文法的代码了(这个例子实际上是匹配了字母a左右的括号)
在稍稍复杂一点的例子里,你可能需要定义自己的Lex词表,具体的例子可以参考example下的Calc.ypj,那个例子实现了一个支持分号和若干种优先级的运算符的表达式计算器。

YYParser的一些内置函数:

Parse(code) - 分析code参数里的代码
Accept()  - 当分析正确结束时回调该方法,你可以重写它(具体可以参考例子Demo1)
Error(errmsg, recoverable) -  强制分析器产生一个语法错误,第一个参数是语法错误的类型,第二个参数是false的时候,将中断后续脚本的解析
Errok()	 -  清除所有的错误(强制让分析器认为解析是正确的)
Recovering()  -  从当前错误中恢复,清空结果堆栈并从当前开始继续分析。

About

能生成Javascript版编译机的yacc

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published