亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

編譯器(解釋器)編寫指南-編寫編譯器(解釋器)的工具-LEX

2019-11-18 18:37:03
字體:
來源:轉載
供稿:網友

關鍵字:   編譯器, 解釋器, LEX, YACC, 編譯原理, 正則表達式, Pascal

預備知識:編譯原理,正則表達式,Pascal

本文并不希望深入透徹的講解編譯原理,而是講解如何利用工具(生成編譯器的編譯器)去編寫編譯器。如果你完全不知道編譯什么東西,那么請看懂了編譯原理,在看此文,本文不是為初學者準備的。

一、什么是編譯器(解釋器)
編譯器是將一種計算機語言翻譯為另一種計算機語言的程序。編譯器將源程序(source language)
編寫的程序作為輸入,翻譯產生用目標語言(target language)編寫的等價程序。源程序一般為高級語言(high-level language),如Pascal 或Delphi,而目標語言則是匯編語言或目標機器的目標代碼(object code),有時也稱作機器代碼(machine code)
  源程序→ 編譯器→ 目標程序
解釋器也是同編譯器一樣的一種語言翻譯程序。它與編譯器的不同之處在于:它立即執行源程序而不是生成目標代碼。從原理上講,任何程序設計語言都可以被解釋或被編譯。

(1) 掃描程序(scanner)
由掃描程序(Scanner)閱讀源程序(通常以字符流的形式表示),進行詞法分析(Lexical analysis),它將源程序翻譯成單詞ID(Token),放入單詞ID(Token)表中。在此過程中,掃描程序會進行簡單的拼寫檢查。

單詞ID(Token):
  一個Token可以有若干種類型,典型的有:關鍵字(keyWord),例如 if 和 while;標識符(identifier)是由用戶定義的變量名,過程名等,它們通常由字母和數字組成并由一個字母開頭;特殊符號(special symbol)如算術符號+和*、一些多字符符號,如 >= 和<>。TokenType 為枚舉數據類型。實際上就是整數值,每一個數值代表一種單詞ID類型。
  TTokenType = (ttNone, ttStrVal, ttIntVal, ttFloatVal,
    //ttNAME 就是標識符 Identifier 或關鍵字
    ttNAME,
    ttSWITCH,
    ttVAR, ttCONST, ttTYPE, ttRECORD, ttARRAY, ttDOT, ttDOTDOT, ttOF,
    ttTRY, ttEXCEPT, ttRAISE, ttFINALLY, ttON, ttREAD, ttWRITE, ttPROPERTY,
    ttPROCEDURE, ttFUNCTION, ttCONSTRUCTOR, ttDESTRUCTOR, ttCLASS, ttNIL, ttIS,
    ttAS,
    ttVIRTUAL, ttOVERRIDE, ttREINTRODUCE, ttINHERITED, ttABSTRACT,
    ttEXTERNAL, ttFORWARD, ttIN,
    ttBEGIN, ttEND, ttBREAK, ttCONTINUE, ttEXIT,
    ttIF, ttTHEN, ttELSE, ttWHILE, ttREPEAT, ttUNTIL, ttFOR, ttTO, ttDOWNTO, ttDO,
    ttCASE,
    ttTRUE, ttFALSE, ttAND, ttOR, ttXOR, ttDIV, ttMOD, ttNOT, ttPLUS, ttMINUS,
    ttTIMES, ttDIVIDE,
    ttEQ, ttNOTEQ, ttGTR, ttGTREQ, ttLESS, ttLESSEQ, ttSEMI, ttCOMMA, ttCOLON,
    ttASSIGN,
    ttBLEFT, ttBRIGHT, ttALEFT, ttARIGHT, ttCRIGHT,
    ttDEFAULT,

    // Tokens for compatibility to Delphi
    ttPRIVATE, ttPROTECTED, ttPUBLIC, ttPUBLISHED,
    ttREGISTER, ttPASCAL, ttCDECL, ttSTDCALL, ttFASTCALL);

  TTokenTypes = set of TTokenType;

為了表示 Token 的內容,一般我們這樣定義Token:
  TToken = Record
    TokenType: TTokenType;
    TokenValue: Variant;
  end;

TP LEX
TP Lex 是詞法分析(Lexical analysis)掃描器源程序的生成器,它用于創建Pascal(TurboPascal, Delohi)掃描器子過程。
TP Lex 分析 LEX 文件(默認擴展名為.L),產生詞法分析(Lexical analysis)掃描器過程,輸出pascal源程序文件。如果 LEX 文件在分析過程發現錯誤,錯誤信息將會被寫入相應的列表文件(擴展名為.lst)。
創建的 pascal 源文件程序將包含詞法分析(Lexical analysis)掃描器過程:yylex。
  function yylex : Integer;
你應該在你的主程序中調用該過程進行詞法分析。每調用一次,yylex 的返回值為當前分析的Token類型值。當文件結束時,yylex 的返回值為0。

yylex 過程的代碼模板在 yylex.cod 文件中。TP Lex 需要該文件構建生成 pascal 源程序文件。該文件必須在當前目錄或TP LEX所在目錄下。另外生成好的源程序需要 LexLib.pas 文件進行編譯。

用法:
  lex [options] lex-file[.l] [output-file[.pas]]

Options(參數)
-------
-v  "詳盡(Verbose):" 在該參數下,Lex 在生成詞法分析器的同時,將生成一個可讀的說明文件,擴展名`.lst'.
-o  "優化(Optimize):" Lex 將優化 DFA 表,產生一個最小的 DFA.

 

如何編寫 LEX 文件(.L)
LEX 文件(.L)分為三個部分,每個部分之間用“%%”隔開:
定義部分(definitions)
%%
規則部分(rules)
%%
輔助過程部分(auxiliary procedures)

三個部分可以都是空的也沒有關系,以行為單位作為語句的分隔符。

定義部分(definitions)
定義部分出現在第1個雙百分號之前。定義部分(definitions)可以包含以下的元素:
- 正則表達式一般定義格式:
 定義的表達式名稱(name)   替換的結果(substitution)

正則表達式的名字也得在該部分定義。這個名字的定義寫在另一行的第1列,且其后(后面有一個或多個空格)是它所表示的正則表達式。定義的名稱(name)必須是一個合法的標識符(第一位必須是字母,第二位可以是字母或數字)
替換的結果(substitution)是一個LEX正則表達式,你也可以在正則表達式中引用前面定義好的表達式名稱,只要將該名稱用花括號("{}")擴起即可。例如,帶符號數字的定義:
Number           [0-9]+
signedNumber   ("+"|"-")? {Number}

- 開始(start)狀態按照如下的格式書寫:
     %start name ...
  這用來指定規則的啟動條件(詳見規則部分)。%start 關鍵字可以被簡寫為 %s 或 %S.

- “%{”與“%}”對
  插入在 “%{”與“%}”對中間的是函數外部的任意Pascal源代碼(請注意這些字符的順序)。

規則部分(rules)
它們由一連串帶有Pascal代碼的正則表達式組成;當匹配相對應的正則表達式時,后面的Pascal代碼(動作)就會被執行。規則的格式如下:
  正則表達式(expression)      語句(statement);
注意:語句(statement)必須是單獨的一個Pascal語句,最后以分號結尾(如果有多個語句使用Begin...End)。語句(statement)可以分成多行書寫,不過后續行必須首先至少留一個空格或tab,用來指示該行是屬于上一行的。使用“|”表示該表達式執行的動作和下一個表達式執行的動作(語句)一樣。例如,Pascal的注釋:
"(*"             |
"{"             begin
                      repeat
                            c := get_char;
                            case c of
                               '}' : ;
                               '*' : begin
                                c := get_char;
                                if c=')' then exit else unget_char(c)
                              end;
                              #0 : begin
                                     commenteof;
                                     exit;
                                   end;
                             end;
                         until false
                     end;

TP Lex 庫單元提供了一系列有用的變量和過程,你可以在你編寫的動作(語句)中使用。如:yytext 變量返回匹配的字符串。yyleng 變量返回匹配的字符串長度。

在規則部分中的“%{”與“%}”對,中間插入的Pascal源代碼,被當作是動作的局部變量(過程)出現。
 
輔助過程部分(auxiliary procedures)
輔助過程部分可以包含Pascal源程序,如輔助過程或主程序,該部分會被簡單的放在文件的末尾。


上一篇:使DevExpress日期控件正確顯示

下一篇:當單擊DBGrid中的標題欄時,進行排序

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人在线网站| 韩国日本不卡在线| 国产主播精品在线| 国产精品1区2区在线观看| 亚洲精品在线看| 精品精品国产国产自在线| 国产精品视频在线播放| 日韩欧美综合在线视频| 久久免费在线观看| 欧美亚洲另类视频| 国产精品夜间视频香蕉| 国产精品网站入口| 色偷偷偷综合中文字幕;dd| 国产香蕉精品视频一区二区三区| 日韩精品久久久久久久玫瑰园| 国内精品国产三级国产在线专| 亚洲高清免费观看高清完整版| 久久精品国产久精国产思思| 一区二区三区久久精品| 国产一区视频在线| 在线日韩中文字幕| 在线观看欧美视频| 成人国产精品久久久| 亚洲精品99久久久久中文字幕| 精品欧美国产一区二区三区| 国产一区二区三区精品久久久| 欧美亚洲免费电影| 欧美另类极品videosbestfree| 国产精品香蕉国产| 97色在线播放视频| 国产精品视频男人的天堂| 亚洲人成77777在线观看网| 九九热这里只有精品免费看| 欧美激情精品久久久久久免费印度| 欧美极品美女视频网站在线观看免费| 日韩在线免费视频观看| 精品国内自产拍在线观看| 亚洲精品wwwww| 黑丝美女久久久| 2019中文字幕在线免费观看| 国产成人97精品免费看片| 国产69精品99久久久久久宅男| 欧美肥臀大乳一区二区免费视频| 亚洲影视九九影院在线观看| 欧美日韩一区二区免费在线观看| 中文字幕av一区二区三区谷原希美| 17婷婷久久www| 国产欧美婷婷中文| 欧美国产在线电影| 欧美午夜精品久久久久久人妖| 亚洲天堂av女优| 亚洲图片在区色| 亚洲男女性事视频| 国产精品香蕉国产| 4444欧美成人kkkk| 国产精品久久久久久久久久尿| 久久久久免费视频| 亚洲国产91精品在线观看| 国产美女久久精品| 亚洲国产黄色片| 日韩中文字幕在线免费观看| 色悠悠久久久久| 欧美大全免费观看电视剧大泉洋| 国产精品色婷婷视频| 国外日韩电影在线观看| 欧美精品久久久久a| 亚洲第一网站男人都懂| 成人性生交大片免费看视频直播| 国内精品小视频在线观看| 亚洲精选中文字幕| 一本一道久久a久久精品逆3p| 日本精品久久久久久久| 日本免费久久高清视频| 精品久久久香蕉免费精品视频| 欧美猛男性生活免费| 久久精品福利视频| 久久人人爽人人爽人人片亚洲| 国产精品成人一区二区| 日韩成人在线视频网站| 国产成人av网址| 亚洲色图校园春色| 欧美激情在线观看| 国产视频自拍一区| 疯狂做受xxxx高潮欧美日本| 色噜噜久久综合伊人一本| 亚洲а∨天堂久久精品9966| 91精品国产91久久久久| 国产亚洲欧美日韩美女| 成人激情综合网| 97在线日本国产| 日韩成人在线电影网| 亚洲欧美中文另类| 91成人精品网站| 国产做受69高潮| 久久久精品欧美| 国产精品一区二区三区在线播放| 最近2019免费中文字幕视频三| 亚洲无亚洲人成网站77777| 美女福利精品视频| 亚洲xxxxx电影| 亚洲男人第一av网站| 欧美成人精品不卡视频在线观看| 影音先锋欧美在线资源| 欧美国产日韩一区二区在线观看| 欧美亚洲一区在线| 国产mv免费观看入口亚洲| 欧美午夜激情小视频| 欧美视频不卡中文| 日韩有码在线播放| 中文字幕在线国产精品| 久热精品在线视频| 91在线观看免费高清完整版在线观看| 久久久国产精品免费| 国产成人亚洲综合91精品| 亚洲精品视频久久| 国产精品美女久久久免费| 亚洲一区免费网站| 日产日韩在线亚洲欧美| 91丝袜美腿美女视频网站| 亚洲一区亚洲二区亚洲三区| 欧美黄色片在线观看| 欧美影院久久久| 国产欧美亚洲精品| 91香蕉亚洲精品| 91精品国产91久久久久久久久| 青青久久aⅴ北条麻妃| 精品电影在线观看| 8090理伦午夜在线电影| 色诱女教师一区二区三区| 日本精品视频在线| 日韩中文视频免费在线观看| 色诱女教师一区二区三区| 午夜免费日韩视频| 欧美成人激情图片网| 亚洲欧洲黄色网| 在线视频欧美日韩| 国内免费精品永久在线视频| 欧美日韩激情美女| 国产精品久久久久91| 欧美日韩国产一区中文午夜| 日韩av在线高清| 国产免费一区视频观看免费| 成人欧美一区二区三区黑人| 91精品免费看| 日韩av手机在线观看| 欧美午夜性色大片在线观看| 亚洲人成免费电影| 91av在线国产| 中文字幕精品av| 精品久久久久久久久国产字幕| 国产精品久久一区主播| 亚洲欧美综合区自拍另类| 日韩av资源在线播放| 成人激情视频在线观看| 国产精品jizz在线观看麻豆| 成人在线观看视频网站| 少妇高潮久久77777| 亚洲美女中文字幕| 国产美女被下药99| 亚洲国产精品成人av| 最近免费中文字幕视频2019| 午夜欧美大片免费观看| 日韩第一页在线| 精品国产91乱高清在线观看|