预览:http://jssc.googlecode.com/svn/trunk/jssc5/bin/index.html
下载:http://code.google.com/p/jssc/downloads/list
源码:http://jssc.googlecode.com/svn/trunk/jssc5/src/
好久不动,都生疏了。离上次5.1alpha版有好几个月了,今天释出beta版,添加了Python语法。
之前说过5.1版本最大的变动是使得添加新的语法变得更加容易,老的5.0版每个新语言都得写个词法分析器太累了,于是乎花大精力修改这一部分,添加了“匹配模式”类,用以方便添加新语法解析。
匹配模式的概念
简单地说,匹配模式就是描述某个语言基本词法单元(Token)的规则。以javascript举例,需要高亮的Token大致有注释、字符串、正则表达式、数字、关键字。其中关键字属于Word中的保留字。注释的匹配模式就是以/*开头*/结尾的代码、字符串是指引号之间的内容等等。
现有的几种匹配模式
所有匹配模式都实现IMatch接口,我目前定义了以下几种:CharacterSet、CompleteEqual、LinearSearch、LinearParse、IDMatch、RegularMatch。
CharacterSet 是个字符集匹配,它定义了Token以什么字符集为开头并以什么字符集为组成内容。比如js中的Word是以下划线、美元符号、字母为开头,下划线、美元符号、字母和数字为组成内容。出于初期设计的原因,字符集不能完全自定义,只能使用已经定义的若干常量。这个缺陷会在以后考虑。
CompleteEqual 是最简单的全等匹配,只有完全相等时才会匹配成功。在js中我用全等来查找花括号和圆括号,因为它们要参与计算深度(折叠功能)。
LinearSearch 线性查找,寻找以什么字符串为开头和结尾的内容。js中注释是以此实现的。注释是以/*开头*/结尾、或者//开头行末结尾。
LinearParse 线性分析和线性查找很像,只是它多了判断转义的逻辑,性能稍稍差一些。js中字符串是以此实现的。字符串以引号开始引号结束,但是结尾的引号可能存在转义的情况,字符串中也可能出现转义符,需要特殊对待。
IDMatch ID匹配和线性查找也有点相似,它定义了以什么字符串为开头,然后匹配一个正则表达式结果。js中并没有直接用到,但其实注释部分也可以用它来实现:以//为开头,匹配的正则表达式是//[^\n]*。至于为什么不用ID匹配来实现呢,那是因为正则的消耗比较大,为性能考虑才使用的线性查找。事实上只要是能用线性查找替换的地方,都应该这样做。
RegularMatch 看名字就知道这是终极解决方案了,和IDMatch的差异也只在于定义开头也是个正则。最消耗的方案。我根本没有用到它,放在那里有备无患而已。
ecmascript的示例
以下是用来解析js、as等语言的定义类文件:
package lexer.rule {
/**
* …
* @author army8735
*/
import lexer.*;
import lexer.depth.*;
import lexer.match.*;
public class EcmascriptRule…
Tags: jssc5
本着想写系列文章《web端语法高亮原理:走进jssc的世界》,介绍jssc的历史和核心算法的,结果无意间发现两个bug,真是丢脸啊。
一是数字高亮的bug,最终处理上居然一小步布尔逻辑写错了,造成长串数字的误认;二是ie下的复制按钮,定位的复制对象居然是“关于”,而不是源代码(少了个parentNode)。
这么明显的失误啊,真想跳楼谢罪了……
话归正题,系列文章会逐步出炉的,将jssc的一切毫无保留地叙述出来。这次失误的收获倒是知晓了其它几个web端的语法高亮器(以前只知道syntax highlighter,貌似也是最知名的),其中最吸引我的是prettify,貌似是google官方的东东。不愧是大佬啊!拿我常用的一段js代码测试了下,prettify是目前我所知js解析器中最为准确的!当然还有一点点小瑕疵,那就是正则的flag(i、m、g)没有跟随正则一起被高亮。不过最让我搞不懂的是,相对简单的flag没有解析正确,反而更难的跨行除法却做到了。
以下是我常用的测试代码,如果web端语法高亮器能解析到jssc的程度,才能够说明是正确了。
//javascript
function none(){
}
/** javascript
jscript
*/
var reg = /[\/][*]([\S\s]*?)(?:[*][/;\[\]]|$)|[\/][/g;](.*)|”((?:\\\\|\\”|[^"])*)”|’((?:\\\\|\\’|[^'])*)’/gm; ”; /\d/.test(1);
reg = 12;
a / b
/reg/;
var num1 = 0.541f;
function f(test) {
…
Tags: beta, jssc, jssc5
国庆期间的努力,TAT~
http://code.google.com/p/jssc/
这里有预览:
http://ff9.ffsky.cn/temp/jssc5/index.html
改进:
相对于alpha版性能至少提升1个数量级而言,beta版也提升了数倍,其中个别逻辑性能提升近10倍。
整体架构有明显变化,体积减小约10%。
改进了对php的支持。
修正了细微的bug,删改细节功能体验。
Tags: beta, jssc5
似乎终于到了消停的日子。只买到30号的票所以请1天假,外加国庆中秋长假一共9天,够爽的了。此外hax在此篇中计划将放出史上最快的Web语法高亮引擎,给俺带来不少压力和动力啊。于是乎十一的休息就用来做jssc5 beta版的开发吧!
功能上jssc5 beta将发生以下变化:
去除鸡肋的异常处理功能。写在web上的代码基本都是本地测试运行过的,做那一点语法纠错功能没多大用,浪费功夫。这个功能还是放到以后的JAse上去吧。
重构框架。整体结构将发生一定改变,主要还是继承方面。分化更细致,有利于最终swf文件体积的减少。
增加自动格式化功能。这其实是以前同事提过的一点,在此准备加上。因web输入等原因造成录入代码缩进问题的话,就不必担心了,因为最终显示会计算缩进量(当然诸如python这样的语言就不行了)。
改善算法,优化性能。这也是最重要的!即使jssc5 alpha已经大大改善了性能,dojo的9k行代码在2秒内跑完,但理论上还有挖掘的潜力!到时候要和hax的PK一番,哈哈!
至于添加语法种类就需要广大爱好者的帮助了。我也准备陆续写关于高亮的文章,分享jssc5的核心算法和具体思路。虽然一直开源,但貌似从未有人对源代码的改善提过建议,我还是写点教程服务人民群众吧。
另外,发现alpha2里的说明alert居然显示的是beta版。上次修改改错,成超前发布了……
Tags: jssc, jssc5
jssc5开发版本测试地址:
http://jssc.googlecode.com/svn/trunk/jssc5/test.html
基于as3和js的。
草草做了个输入框,放在了googlecode的svn上,所以ie下看这个反而会解析为html,其它的可能会只是文字。勉强一下了。
仅写了ecmascript4的lexer(即javascript和actionscript),在词法分析上多做了一些语法分析上的纠错功能,语法分析的内容本次将暂不涉及到。用mootools、jquery、dojo的代码测试了下,目前所有已知bug都已修正。
本次jssc5是基于词法分析的,功能比以前大大增强,性能也有显著增加。但缺点就是必须为每种语言编写不同的lexer,所以将考虑优先一些常用语言的编写。
(注:是每种不是每一个,像javascript和actionscript就是同种语言属于ecmascript,而c、java、c++也可用同种lexer解析)。
可以输入一些明显错误代码,如:var i = 0s; 词法处理上会告知出现的错误并且暂停分析,错误后面的代码会被格式化后保存。
代码折叠已有,深度也已经计算出来,只是没有让它显示出来。:P
源代码过几天会放到googlecode的svn上,lgpl协议。由于语种过多,我个人熟悉的语言也就那几个,因此有兴趣的人欢迎来编写其它语言的lexer,主页上参与编写的人员将会增加你的名字。
—
关于jssc的项目主页以及之前的老版本或者想使用它的,请看这里:
http://code.google.com/p/jssc/
Tags: jssc5