`
marlonyao
  • 浏览: 249121 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Javascript代码格式化器

阅读更多
JsBeautifier是一个用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来替代。用异常来控制流程是一种反模式,但是我实现想不出比这更妙的方法了。

代码见附件或者这里


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

可以用来替换C语言中的:do {...} while(cond)。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics