I. lexial analyer
lexial analyer 是compiler front end中最初步的工作之一,負責將char stream切割為token stream,discard註解等無用部份。
比較常見的有jlex和jflex,我使用的版本和測試環境如下:
- FreeBSD? 6.2-RELEASE
- jflex-1.4.1_1
- jlex-1.2.6_2
- diablo-jdk-1.5.0.07.01_9
jlex是使用java的lex產生器,由Elliot Joel Berk and C. Scott Ananian製作。整個製作lex analyzer的過程基本上分成三部奏:
- 撰寫rule file
- 使用flex產成lex analyzer source
- 使用gcc copmile lex analyzer
Setup
在此以前述environment做說明
cd /usr/ports/java/diablo-jdk;
修改Makefile將X相關的註解掉免得裝一堆垃圾
然後設定不要用timezone要不然還要另外抓東西
make install clean;
因為版權問題,FreeBSD 預設沒有安裝jdk,而且也不能直接使用port tree system安裝。所以他會提示你去FreeBSD網站下載tarball後放到/usr/ports/distfiles...因為不能直接下fetch去抓,所以還要另外裝個lynx之類的去抓,頗麻煩。
cd /usr/ports/java/jlex;
make install clean;
rehash; //if you use C shell
flex vs jlex
除了使用語言不同外,jlex的架構和lex/flex有很大的差別:
user code
%%
JLex directives
%%
regular expression rules
其中JLex directives是jlex很特別的部份,其他兩部份則和flex的rules和user code兩部份相近。
regular expression rules
在rule的部份,pattern基本上是相容的,都是RE; 但是action就差很多了(C vs Java)
jflex
由於jflex源自jlex,所以這邊主要是在比較兩者
setup
基本上和jlex的情況一下...
cd /usr/ports/java/jflex;
make install clean;
rehash; //if you use C shell
jlex vs jflex
以同樣一份rule file去產生source code,數據如下:
jlex
- NFA - 247 states
- DFA - 116 (after removal of redundant states)
jflex
- NFA - 202 states
- DFA - 114 states (after minimized DFA)
結果jflex好像有好那麼一滴滴...不過由於我的rule file十分簡單,要是更複雜的rule file,差距可能會更大。

0 意見:
張貼意見