Antlr

warning: Creating default object from empty value in /srv/www/blog.sqlitedeveloper.com/www/modules/i18n/i18ntaxonomy/i18ntaxonomy.pages.inc on line 34.

将C语言Header文件转换为Delphi接口定义的自动程序

http://convertc.appspot.com

这个程序可以将C语言的头文件转换成Delphi的接口定义。目前支持简单的宏定义,结构体,枚举,函数定义。

目前用Firefox访问时,gwt对换行的处理有些问题,无法正确解析头文件,暂时请用IE访问。

另外,目前程序对于数组指针,函数指针的处理还有问题。
 

比如转换前

AntlrMorph和gDiff

Antlr 3.1beta1 终于发布了

Antlr3.1 beta1终于发布了,增加了一些新特性,但是我更感兴趣的Bug修正不是很多。接下来的一两个月里面有空会去研究一下。不过很可能没什么时间{#emotions_dlg.tongue_out}

Antlr的错误恢复机制

Antlr的错误恢复机制很重要,有利于写出很健壮的Parser,比如一般的单行注释需要有回车符号,但是有时用户在程序的最后会输入没有回车符号的单行注释,我们的Parser也要考虑这种情况

可以使用状态维护方式来处理这类不完整的Token,在Lexer中添加下列方法。

int state;

int getState() {
return state;
}

void resetState() {
state = 0;
}

 

将单行注释的语法由原来的

Antlr中的Semantic Predicates

有些时候由于Antlr不是真正的LL(K)算法,会产生二义性的代码,这时需要我们手工来编写LookAhead的判断语句。这就用到了Semantic Predicates

 

语法结构为{XXXX}?,示意如下

如何区分关键字和普通标示符号

大部分语言都提供了标示符号的词法规则,而关键字是特殊的标示符号,一个典型的标示符号的词法规则如下 ID : LETTER (LETTER | DIGIT)*; 但是按照上面的词法规则,没办法区分标示符号和关键字,Antlr允许我们创建一个关键字哈希表来解决这个问题。通常来说,当我们在文法中输入用双引号标示的关键字的时候,antlr生成代码时会自动创建相应的关键字哈希表。

不能在Parser部分对Rule使用~操作符号

不能在Parser部分对Rule使用~操作符号

对于Parser Rule,只能使用+, *, ?

但是可以对Lexer Rule使用~操作符号

antlr的缺点之一

出于性能的考虑,Antlr没有实现完全的LL(K)解析,而是用了线性的LL(K),但是线性LLK会产生很多的不确定性。经常导致你需要将自然的Parser Rule改写为不自然的形式。

不过据说Antlr 3将提供完全的LL(K)实现,不过从目前的进度来看,感觉要到2007年能推出就不错了:(

Antlr的贪婪模式语法

.-noscript-blocked { border: 1px solid red !important; background: white url("chrome://noscript/skin/icon32.png") no-repeat left top !important; opacity: 0.6 !important; }

下面的规则是非贪婪模式的语法,它会匹配{之后的任意字符而不会匹配}符号,


CURLY_BLOCK_SCARF
: '{' (.)* '}'
;

 

要想让Antlr能够匹配},我们需要将规则改为

同步内容