資源描述:
《lex和yacc工具使用方法》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、編譯器的自動生成工具LEX和YACC的使用方法???Lex自動地表示把輸入串詞法結構的正規(guī)式及相應的動作轉換成一個宿主語言的程序,即詞法分析程序,它有一個固定的名字yyler,在這里yyler是一個C語言的程序。???Yylex將識別出輸入串中的詞形,并且在識別出某詞形時完成指定的動作。???看一個簡單的例子:寫一個lex源程序,將輸入串中的小寫字母轉換成相應的大定字母。???程序如下:???%%???[a-z]printf(“%c”.yytext[0]+'A'-'a');???上述程序中的第一行%%是一個分界符,表示識別規(guī)則的開始。第二行就是識別規(guī)則。左邊是識別小寫字母的正規(guī)式。右邊就是識別
2、出小寫字母時采取的動作:將小寫字母轉換成相應的大寫字母。Lex的工作原理是將源程序中的正規(guī)式轉換成相應的確定有限自動機,而相應的動作則插入到y(tǒng)ylox中適當的地方,控制流由該確定有限自動機的解釋器掌握,不同的源程序,這個解釋器是相同的。1.2lex源程序的格式???lex源程序的一般格式是:???{輔助定義的部分}???%%???{識別規(guī)則部分}???%%???{用戶子程序部分}其中用花括號起來的各部分都不是必須有的。當沒有“用戶子程序部分”時,第二個%%也可以省去。第一個%%是必須的,因為它標志著識別規(guī)則部分的開始,最短的合法的lex源程序是:??%%???它的作用是將輸入串照原樣抄到輸出文
3、件中。???識別規(guī)則部分是Lex源程序的核心。它是一張表,左邊一列是正規(guī)式,右邊一列是相應的動作。下面是一條典型的識別規(guī)則:???integerprintf("foundkeywcrdINT");???13這條規(guī)則的意思是在輸入串中尋找詞形“integer”,每當與之匹配成功時,就打印出“foundkeywordINT”這句話。???注意在識別規(guī)則中,正規(guī)式與動作之間必須用空格分隔開。動作部分如果只是一個簡單的C表達式,則可以寫在正規(guī)式右邊同一行中,如果動作需要占兩行以上,則須用花括號括起來,否則會出錯。上倒也可以寫成:???integer{printf("foundkeywordINT");
4、}???下面先介紹識別規(guī)則部分的寫法,再介紹其余部分。1.3Lex用的正規(guī)式???一個正規(guī)式表示一個字符串的集合。正規(guī)式由正文字符與正規(guī)式運算符組成.正文字符組成基本的正規(guī)式,表示某一個符號串;正規(guī)式運算符則將基本的正規(guī)式組合成為復雜的正規(guī)式,表示字符串的集合。???例如:???????????????ab???僅表示字符串ab,而??????????????(ab)+???表示字符串的集合:??????????????{ab,abab,ababab,…)。???Lex中的正規(guī)式運算符有下列十六種:???”[]∧-?"*+
5、()/${}%<>???上述運算符需要作為正文字符出現(xiàn)在正規(guī)式中時,必
6、須借助于雙引號”或反斜線\,具體用法是;???xyz“++”或xyz\+\+???表示字符串xyz++???為避免死記上述十多個運算符,建議在使用非數字或字母字符時都用雙引號或反斜線。???要表示雙引號本身可用\”,要表示反外線用”\”或???前面說過,在識別規(guī)則中空格表示正規(guī)式的結束,因此要在正規(guī)式中引進空格必須借助雙引號或反斜線,但出現(xiàn)在方括號[]之內的空格是例外。幾個特殊符號:\n是回車換行(newline)\t是tab\b是退格(backspace)13下面按照運算符的功能分別介紹上述正規(guī)式運算符。1.字符的集合用方括號對可以表示字符的集合。正規(guī)式[abc]與單個字符a或b或c匹配在方
7、括號中大多數的運算符都不起作用,只有\-和∧例外。運算符-表示字符的范圍,例如[a-z0-9<>-]表示由所有小寫字母,所有數字、尖括號及下劃線組成的字符集合。如果某字符集合中包括-在內,則必須把它寫在第一個或最后一個位置上,如[-+0-9]與所有數字和正負號匹配在字符集合中,運算符∧必須寫在第一個位置即緊接在左方括號之后,它的作用是求方括號中除∧之外的字符組成的字符集合相對于計算機的字符集的補集,例如[∧abc]與除去a、b和c以外的任何符號匹配。運算符\在方括號中同樣發(fā)揮解除運算符作用的功能。2.與任意字符匹配的正規(guī)式運算符.形成的正規(guī)式與除回車換行符以外的任意字符匹配。在lex的正規(guī)式中
8、,也可以用八進制數字與\一起表示字符,如[\40-\176]與ASCII字符集中所有在八進制40(空格)到八進制176(~)之間的可打印字符匹配。3.可有可無的表達式運算符?指出正規(guī)式中可有可無的子式,例如ab?c與ac或abc匹配,即b是可有可無的。4.閉包運算???運算符*和十是Lex正規(guī)式中的閉包運算符,它們表示正規(guī)式中某子式的重復,例如"a*"表示由0個或多個a組成的字符串的集合,而"a+