今天不小心看到了
http://www.antlr.org/works/index.html,我一直认为ANTLR是LR(k)分析器,后来我错了,原来只是LL(k)。我以前写的一个Vczh Syngram是LR(k)的畸形,今天看了居然连LL(k)都能有GUI,我不做一个岂不是对不起自己?
Vczh Syngram是一个在C++下面用的编译器的语法分析框架,只需要在C++代码里面写上文法,到时候initialize出一个接口来就可以帮你搞定语法分析了。当然分析完要生成语法树还是什么的是由你决定的。不过虽然现在写编译器的语法分析只要syngram+文法,但是调试起来还是比较囧的。ANTLRWorks的想法真是好啊,GUI封装完了之后我就做一个Vczh Syngram的图形界面来当demo吧,一举两得。到时候这个demo产生使用Vczh Syngram的一部分代码,爽啊。
Vczh Free Script 2.0的代码文件里就有一个文件是调用Vczh Syngram的文法代码。
今天某
空明跟我说我的Vczh Syngram没文档害他只能用yacc写一个软件渲染器用的shader compiler。有了GUI之后,连文档都免了吧。嘿嘿。等最近GUI封装完之后,就把这个程序写了,也能用通俗易懂的方法来告诉别人我这套框架是怎么用的。
话说Vczh Syngram在开发的时候为了检查出文法的歧义花了一个星期的时间未果,因为LALR实在是不能用,用了在分析之后就很难还原出到底分析的这条路是调用了什么文法,文法绑定的工作也就非常不好做了。于是我换了一种办法,我输出所有歧义的可能就行了。后来发现输出歧义比检查文法好多了,因为有些时候我们需要歧义才能解决问题。我自己有过一个叫Gotalk的残废脚本,后来没公开出来,也没有完成所有代码。这个脚本是这样子的:
phrase max of (number1 is integer) and (number2 is integer) returns integer
if number1 is larger than number2 then
return number1
else
return number2
end if
end phrase
phrase max of(number1 is integer),(number2 is integer) and (number3 is integer)returns integer
return max of max of number1 and number2 and number3
end phrase
//下面这些是外接函数定义,由虚拟机处理
external phrase print (text as string) links "print"
external pharse input returns string links "input"
//下面是主函数,输入3个数字输出最大那个
phrase main
define n1 , n2 , n3 as integer
let n1 be integer of input
let n2 be integer of input
let n3 be integer of input
print string of max of n1,n2 and n3
end phrase
在处理这个语法的时候,我的程序第一次扫描文件的时候动态组织文法给syngram,第二次用syngram给出结果。这个时候我需要歧义,因为我可以在歧义里面排除所有不能通过类型检查的结果,最终获得用户所希望的表达方法。后来基本上是弄出来了,但是经过调查发现其实不会有什么人用的,实际上是因为英语跟程序相差太远了,很多概念我重组了别人不一定能够接受。不过这是DSL语言所向往的一种办法。本来这门语言里面还支持从句(也就是平常见到的lambda expression),还有类啊继承什么的。函数根据参数在不同的位置还自动获得优先级,能写出类似sin of a,或者干脆定义运算符| a |计算绝对值也行,甚至还能写a is a prime number(譬如判断a是不是质数if a is a prime number then...)。懒得写大代码展示了。什么时候无聊了再重新写一个好一点的。到时候跟Vczh Free Script共享后端虚拟机,就可以实现互相调用并共享类库了,爽啊。
有了Syngram,做编译器还是很方便的,可以将精力花在后端上。前端不应该由人来完成。
posted on 2008-08-14 05:21
陈梓瀚(vczh) 阅读(1613)
评论(2) 编辑 收藏 引用 所属分类:
C++