編譯原理 用Lex做詞法分析

2021-09-01 09:04:15 字數 2946 閱讀 3930

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...