Javascript代码格式化器

[url=http://jsbeautifier.org/]JsBeautifier[/url]是一个用Javascript写的在线Javascript代码格式化工具。用javascript写的好处是只要一个浏览器就可以运行,很方便,坏处在于若是想通过命令行(例如需要脚本化)去运行时就会比较困难。之所以说比较困难,是因为JsBeautifier是可以通过Rhino来运行的,Rhino是一个用java写的javascript解释器。但是我还是闲得无聊,将这个javascript程序转化成了python。

javascript和python语言上很相近,所以将javascript程序转到python最麻烦的地方就是转换语法,例如将{...}块转换成python的缩进块,&&转成and,||转换成or,去掉if、while中多余的括号,语句中多余的冒号。

我碰到的一个困难是javascript嵌套函数可以直接改变外围函数的局部变量引用,而python嵌套函数虽然可以访问外围函数的局部变量,但却不能直接修改引用,这会使python认为它是嵌套函数的局部变量。为了解决这个问题,我创建了ctx对象,它包含嵌套函数需要直接修改的变量。

另外一个问题是python中没有switch语句,这一般不是问题,因为这可以用if...elif...else语句来模拟。问题在于javascript中switch语句可以有break,这导致控制流程直接跳到switch语句结尾处,而python中if...elif...else语句却没有相应流程跳转功能,一个容易想到的方法是使用一个flag变量来控制流程,但是这十分麻烦,尤其当中转发生在许多嵌套的if...else语句中时,flag需要一层一层地往外传递,每个分支处都需要检查flag的值。另一种方法是使用异常,用一个try...except包含整个if...elif...else语句,凡是switch中的break用raise FlowException来替代。用异常来控制流程是一种反模式,但是我实现想不出比这更妙的方法了。

代码见附件或者[url=http://code.google.com/p/jsbeautifier-python/source/browse/trunk/jsbeautify.py]这里[/url]。


P.S. 最近在《系统程序员成长计划》上看到用do...while(0)来实现流程跳转的方法,觉得很不错,可以用来替代用异常实现流程控制的方法。python中没有do...while语句,但很容易用while(True)来模拟。

while(True):
# some code here...
if not cond:
break

可以用来替换C语言中的:do {...} while(cond)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值