? 發問時間: 電腦與網際網路程式設計 · 1 0 年前

什麼lex,flex

剛要學compiler這門課程

有提到lex,

但不太懂,什麼是lex??

已更新項目:

嗯....我有大致找些簡單的lex範例,

操作你說的動作,也大概瞭解lex的用途,

但說要做c的lex,那豈不是一堆規則,

該如何下手,又有class....if....等的字元,

他應該被分類成什麼?

2 個已更新項目:

哇,真的感謝

另外feedback

http://www.math.grin.edu/~stone/courses/languages/...

java的語法

1 個解答

評分
  • ?
    Lv 7
    1 0 年前
    最佳解答

    lex -> lexical analyzer

    基本上,它是一個小程式,它的作用就是把一串字元流,按照你說的規則,分成一塊一塊的 token,轉成一串的 token 流… 這一串的 token 流,才可以被 compiler 下一階段的小程式去處理…

    例:假設我們定義一個很簡單的計算機語言

    它可以作整數的 +,-

    例: 13 + 2 = 或 3 + 2 - 2 +10 =

    所以以上面的例子來說你的計算機的 lexical analyzer 的輸入就是一串字串 "13 + 2 =",而 lex 的輸出會類似: "<數字token,13> <加號token> <數字token,2> <等號token>" 總共有 4 個 token…

    你的計算機的 lexical analyzer 的責任只有把字串轉成 token,至於語法是否正確,不是它的責任…

    例:要是你的輸入字串是 "3 + = 2 = 3 + 10",你的計算機的 lexical analyzer 不會回傳說有錯誤,它只會回傳:"<數字token,3> <加號token> <等號token> <數字token,2> <等號token> <數字token,3> <加號token> <數字 token,10>"

    但這也不代表 lexical analyzer 沒有任何錯誤處理的能力… 例:要是你的輸入字串是 "3= A",因為 A 不是任何一個合法的 token 裡可以包含的字元,所以 lexical analyzer 就會回傳錯誤…

    通常程式語言中的註解部份,就是在 lexical analyzer 端直接去除的…

    例:

    "int a;" lexical analyzer 可能會回傳 "<Type Token, int> <Variable Token, a> <Semi Colon token>"

    而 "int /* this is a comment */ a; // another comment" lexical analyzer 一樣會回傳 "<Type Token, int> <Variable Token, a> <Semi Colon token>"… 所以你就可了解為什麼 commet 怎麼加基本上都不會影響程式本身的運算…

    ---

    而 flex 是一個小程式,你給它你語法 lexcial anylyzer 所需要辨認的 token 的規則,他就會產生一個 C 檔,這個 C 檔裡面有一個 function (通常叫 yylex),就是上面所說的 lexical analyzer… 你就可以在你的 compiler 的主程式中呼叫這一個 yylex 來作 lexical analyzer 的動作…

    lex 的輸入規則跟 regular expression 有很多的關係,基本上每一種不同的 token 就是符合一個 regular expression 的字串… 而要是有一串字串不符合任何一個 regular expression,就會像上面的 example 那樣,lex 就會回傳錯誤…

    2007-03-16 14:33:37 補充:

    初學者要作的 compiler 應該是只會作到 C,不會作到 C++的 (因為 C++最後的實作有很多是滿進階的東西)

    http://www.math.grin.edu/~stone/courses/languages/...

    上面是完整的 Backus-Naur form 的 C 語言 syntax … 你看一下,就應該知道你的 tokens 是那些…

    2007-03-16 14:46:24 補充:

    註:compiler 滿好玩的,你學寫 compiler 後,就會開始要解決因為語言的定義所會產生的一些奇怪的程式… 所以你也會對這個語言有很深刻的了解…

    例:a = i j;

    這一段程式是要解釋成 a = i ( j); 呢?還是 a = (i ) j; ?

    http://msdn2.microsoft.com/en-us/library/3yx2xe3h....

    2007-03-16 14:49:14 補充:

    還有像是我以前作的 lex (以前老師叫我們自已用手寫 yylex,不能用 flex)… 明明覺得沒問題,碰到老師給我們的 test set,就會死得一榻糊塗… (我們都是死在多行 commet 的處理上面,老師給我們一堆奇怪的 commet 行)

    2007-03-16 14:55:58 補充:

    a = i+++j;

    a = (i++)+j;

    a = i +(++j);

還有問題?馬上發問,尋求解答。