一直想擁有一個屬于自己的詞法分析器(掃描器)生成器,本來想在一些現(xiàn)成的開源項目JLex、JFlex上修改,但感覺它們的代碼實在難于下手,于是開始自己寫,中間停停改改,也不記得做了多久了,現(xiàn)在算是基本成型了。
因為只是自己做,基本上是有了想法就加進去,因此到了后來,和傳統(tǒng)的生成器是看上去是很不相像了,但Rsg確實有能力實現(xiàn)復雜掃描器(在examples中用Rsg實現(xiàn)了一個Java源程序掃描器)。主要的特點有:
有興趣者可到這里去下載試用:
http://www.tkk7.com/Files/20070716/rsg-1_0B.zip
下面是一個簡單掃描器的Rsg描述文件實例,它實現(xiàn)了一個能識別標識符、整數(shù)、簡單的字符串、字符并忽略空白和注釋的掃描器(取自《Rsg使用指南》):
/**
* 這是一個簡單的Rsg示例。
*/
regexp LineTerminator = "\r" | "\n" | "\r\n" ;
regexp WhiteSpace = LineTerminator | [' ', '\t', '\f'] ;
regexp Comment = "/*" % "*/" ;
regexp Letter = ['a'-'z', 'A'-'Z'];
regexp Digit = ['0'-'9'] ;
regexp Identifier = Letter (Letter | Digit) * ;
regexp Integer = Digit + ;
regexp StringCharacter = ~['\r', '\n', '\"'] ;
regexp SingleCharacter = ~['\r', '\n', '\''] ;
scanner RsgQs {
'"' StringCharacter * '"' : return STRING; /* 字符串 */
'\'' SingleCharacter '\'' : return CHARACTER; /* 字符 */
Identifier : return IDENTIFIER; /* 標識符 */
Integer : return INTEGER; /* 整數(shù) */
Comment : skip; /* 注釋 */
WhiteSpace :skip;
eoi : return EOI;
}