初學編譯原理,老師布置了乙個小task:計算乙個文字中的字元數和行數。想著應該沒多難,結果最後因為種種也是搗鼓了蠻久的。不過有一說一倒是感覺這種先寫出一段**,再用別的程式跑出來生成新的**之後執行的感覺蠻有意思的。等過兩天寫個yacc看看(或許到時候就不那麼想了。。。)
//注意以下為.l檔案中的**。%%
%[a-z]}[
0-9]
}[a-z]
}\n ./*
前三種情況下字元數都加一。如果flag是1,則單詞數加一,再把flag變成0.
如果為\n,說明換行了。行數加一,字元數加一。flag變為1.
如果為.,則字元數加一,flag變為1(空格後即為新詞)*/%
%int
main()
yyin = file;
yylex()
;printf
("行數: %d\n"
, linenum)
;printf
("字元個數: %d\n"
, charnum)
;printf
("單詞個數: %d\n"
, wordnum)
;return0;
}
**部分反倒沒那麼難,直接匹配規則即可。我舍友沒這麼寫,用了一大堆yylex庫函式,反倒顯得我這麼寫比較取巧。。。
主要耗費我時間的地方在於一開始的環境配置。在我第一次做的時候,前面一路順風順水,直到最後一步,在visual studio中執行的時候一直提示yylex()未宣告,以及其他的幾個yy變數未定義。我一開始認為是我的庫有問題,於是更換了庫重新做,還是不行。之後懷疑是路徑問題,於是用了個全新的路徑,也不行。。。在忙了2個小時以後我放棄了,直接在舍友的電腦上重新做了一次,一遍過。。。。。。可能真就是我電腦的問題(無語)。之後我把生成的.l、.c、.h拷到我電腦上,之後再用這些執行就成功了。
lex初學總結(二)
iii.lex 格式 這裡以乙個能分析類似c語言的lex程式原始碼 注釋來說明。在這裡定義re表示式 keyword if while do break true false int char bool real float switch case digit 0 9 letter a za z s...
lex初學總結(一)
最近在學習編譯原理,寫些lex yacc的總結備忘。根據 lex與yacc 中文第二版 i.re的表示 匹配除 n外的任意字元 匹配符號前表示式的0次或多次出現 閉包 匹配符號前表示式的1次或多次出現 匹配符號前表示式的0或1次出現 表示式間的邏輯或 用來指定範圍,如 a z,0 9,a z等 匹配...
編譯原理 用Lex做詞法分析
08年9月入學,12年7月畢業,結束了我在軟體學院愉快豐富的大學生活。此系列是對四年專業課程學習的回顧,索引參見 用lex建立乙個詞法分析器 衝突解決規則 1 總是選擇最長的字首 2 如果最長的可能字首與多個模式匹配,總是選擇lex中先被列出的模式。安裝parser generator,並編譯lex...