08年9月入學,12年7月畢業,結束了我在軟體學院愉快豐富的大學生活。此系列是對四年專業課程學習的回顧,索引參見:
用lex建立乙個詞法分析器
衝突解決規則: 1)
總是選擇最長的字首 2)
如果最長的可能字首與多個模式匹配,總是選擇lex中先被列出的模式。
安裝parser generator,並編譯lex和yacc函式庫
使用嚮導配置時,用的vs2010,屬性設定如下(有些庫是用的vc++6.0)
compiler bin directory
c:\program files\microsoft visual studio 10.0\vc\bin
compiler bin directory(2)
c:\program files\microsoft visual studio 10.0\common7\ide
compiler include directory
c:\program files\microsoft visual studio 10.0\vc\include
compiler include directory(2)
c:\program files\microsoft visual studio\vc98\include
compiler library directory
c:\program files\microsoft visual studio 10.0\vc\lib
compiler library directory(2)
c:\program files\microsoft visual studio\vc98\lib
(1)練習3.5.2:編寫乙個lex程式。該程式拷貝乙個檔案,並將檔案中的每個非空的空白符序列替換為單個空格。
編寫lex程式如下:
[\t]+
表示遇到連續多個空白符(或製表符),則替換為乙個空格符
\n|.
表示其餘的語句均照常列印出來
實驗結果
讀入檔案:
替換掉空白符後結果:
(2)練習3.5.3:編寫乙個lex程式。該程式拷貝乙個c檔案,並將程式中的關鍵字float的每個例項替換成double
編寫lex程式如下:
\」.*\」
表示如果是在雙引號(「)中(即為字串),則照常列印
float/[ \t]+
表示如果遇到float,且附加模式是後面跟有空白符,則將float替換為double
在這句話前面加上
[^ \t\n]+
(連續的非空白符),是為了保證當float並非關鍵字時,如afloat,不會被替換為adouble.
實驗結果
讀入c檔案:
替換掉關鍵字float後如下:
(3)練習3.5.4:編寫乙個lex程式。該程式把乙個檔案改變成為「pig latin」文。明確的講,假設該檔案是乙個用空白符分隔開的單詞(即字母串)序列。每當你遇到乙個單詞時:
1)如果第乙個字母是子音字母,則將它移到單詞結尾,並加上ay
2)如果第乙個字母是母音字母,則只在單詞的結尾加上ay
所有非字母的字元不加處理直接拷貝到輸出
編寫lex程式如下:
()*/[ \t\n]+
表示遇到母音字母開頭的字母串,且附加模式跟有空白符(確保為單詞),則在單詞結尾加上ay
()*/[ \t\n]+
表示遇到子音字母開頭的字母串,且附加模式跟有空白符(確保為單詞),則從單詞第二個字母開始輸出,之後輸出第乙個字母,再在結尾加上ay
實驗結果
輸入aword bword 「word」,轉換成「pig latin」文結果:
(1)通過實驗熟悉了lex做詞法分析。在定義規則時,對lex解決衝突的兩個原則體會尤深——總是選擇最長的字首;如果最長的可能字首與多個模式匹配,總是選擇lex中先被列出的模式。
(2)實驗中幾個題目並不複雜,但卻很難考慮到所有的情況,如第二個練習替換float時,不能只遇到float即可,還要判斷其是否為關鍵字。在後面發現實驗中忘了考慮float單詞出現在注釋中的情況。不過考慮方法和高階實驗中的考慮相似。
編譯原理詞法分析
編譯原理實驗一 詞法分析練習 include include include define tokenmax 100 define progmax 1000 define k esc 27 void analytics 詞法分析 void scanner 輸入掃瞄 bool isletter cha...
詞法分析(編譯原理)
詞法分析 英語 lexical analysis 是電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer,簡稱lexer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...
編譯原理詞法分析
1 注意識別符號和無符號整數的重複問題,本人採用map解決。2 cin ch自動忽略空白字元。include include include include using namespace std struct pairs int isboundaries char ch return 3 case...