Lex與Yacc學習(四)之Lex規範

2021-06-28 08:07:34 字數 1277 閱讀 1759

lex程式由三部分組成:定義段、規則段和使用者子例程式段

...定義段...

...規則段...

...使用者子例程式段...

這些部分由以兩個百分號組成的行分隔開。儘管某一部分可以為空,但前兩部分是必須的,第三部分和前面的%%行可以忽略。

定義段包括文字塊、定義、內部表宣告、起始條件和轉換。

以空白開頭的行被逐字拷貝到c檔案中,通常,這用於包含包圍在/*和*/中的注釋,一般前面有空白。

規則段包含模式行和c**,以空白開始的行或者包圍在%中的內容是c**。以任何其他形式開始的行是模式行。

c**被逐字拷貝到生成的c檔案中。

當lex掃瞄程式執行時,它把輸入與規則段的模式進行匹配。每次發現乙個匹配(被匹配的輸入稱為標記(token))時就執行與那種模式相關的c**。如果模式後面跟著|符號,則該模式將使用與檔案中下乙個模式相同的c**。當輸入字元不匹配模式時,詞法分析程式的動作就好像它匹配上了**echo的模式,echo將標記的拷貝寫到輸出。

使用者子例程式段的內容被lex逐字拷貝到c檔案,這一部分通常包括從規則中呼叫的例程。如果重新定義input()、unput()、output()、或者yywrap(),新的版本或者支援子程式,都可以放在這裡。

大多數lex實現都需要有用的例程庫,通過在unix系統的cc命令列的結尾(或其它系統的等價物上)給出-ll 標誌來鏈入庫。庫的內容根據實現的不同有所改變,但它總是包含main()。

lex的所有版本都有最小的main()程式,它對於簡短程式和測試都是很有用的。它非常簡單,內容如下:

main(argc,argv)

int argc;

char **argv;

int yywrap()

只要是在掃瞄程式匹配標記時,標記的文字就被儲存在以空字元終止的字串yytext中,而它的長度存在yyleng中, yyleng()返回的值與strlen(yytext)返回的值是相同的。

由lex建立的掃瞄程式有入口點yylex()。呼叫yylex()啟動或重新開始掃瞄。如果lex動作執行將數值傳遞給呼叫程式的return,那麼yylex()的下次呼叫就從它停止的地方繼續。

當詞法分析程式遇到檔案結尾時,它呼叫例程yywrap()來找出下一步要做什麼,如果yywrap()返回0,則掃瞄程式就繼續掃瞄,如果返回1,則掃瞄程式就返回報告檔案結尾的零標記。

lex庫中的yywrap()的標準版本總是返回1,但是可以用自己的值來替代它,如果yywrap()返回指示有更多輸入的0,那麼它首先需要調整指向新檔案的yyin,可能需要使用fopen()。

Lex與Yacc學習(九)之Yacc語法

本文討論yacc語法的格式並描述可用的各種特徵和選項 yacc語法包括三部分 定義段 規則段和使用者子例程段 定義段.規則段.使用者子例程段.各部分由以兩個百分號開頭的行分開,儘管某乙個部分可以為空,但是前兩部分是必須的,第三部分和前面的百分號可以省略。yacc 語法由符號組成,即語法的 詞 符號是...

Lex與Yacc學習(十)之Yacc庫

每個實現都需要有用的例程庫,在unix系統中,可以通過cc命令列尾端給出 ly標誌 或通過其他系統下的等價物 來包含庫。庫的內容在不同的實現之間是不同的,但總是包括main 和yyerror yacc的所有版本都帶有最小的主程式,該程式對於簡短程式和測試有時是很有用的,它非常簡單,如下所示 main...

Lex與Yacc的結合

lex與yacc的結合 首先,我就不介紹lex的語法規則了,因為在一些書上這些是重點介紹的內容,我先把lex的源程式寫在下面,然後講解。number 0 9 其中 define number 257 define plus 258 define sub 259 define chen 260 def...