lex初學總結(一)

2022-03-19 03:31:58 字數 1211 閱讀 9022

最近在學習編譯原理,寫些lex&yacc的總結備忘。

根據《lex與yacc》中文第二版

i. re的表示

匹配除\n外的任意字元

匹配符號前表示式的0次或多次出現(閉包)

匹配符號前表示式的1次或多次出現

匹配符號前表示式的0或1次出現

|表示式間的邏輯或

-用來指定範圍,如:

a-z, 0-9, a-z等

匹配括號內的任意字元,相當於("a"|"b"...)

[^...]

第乙個字元是^的,匹配除括號內的任意字元

{}指出乙個模式可能出現的次數,如: a 表示 a 可能出現1次或(到?)3次

「...」

雙引號中的每個字元解釋為字面意義(除了c轉義字元外)

( )將一系列re組成乙個新的re

^作為re中的第乙個字元匹配一行的開頭$作為

re中的最後乙個字元匹配一行的結尾

\轉義元字元

/條件匹配,當/後的表示式被滿足時匹配/前的表示式,如:規則為

a0/1,輸入 a01,則其中的a0 是匹配的

ii. 內部變數(常用)

內部預定義變數:

yytext     char *   當前匹配的字串

yyleng     int        當前匹配的字串長度

yyin        file *    lex當前的解析檔案,預設為標準輸出

yyout      file *    lex解析後的輸出檔案,預設為標準輸入

yylineno  int         當前的行數資訊

內部預定義巨集:

echo     #define echo fwrite(yytext, yyleng, 1, yyout)  

也是未匹配字元的預設動作

內部預定義的函式:

int yylex(void)    

呼叫lex進行詞法分析

int yywrap(void)  

在檔案(或輸入)的末尾呼叫,如果函式的返回值是1,就停止解析。它可以用來解析多個檔案,**可以寫在第三段,這樣可以解析多個檔案。方法是使用 yyin 檔案指標指向不同的檔案,直到所有的檔案都被解析。最後,yywrap() 返回1來表示解析的結束。

yyless(int n)

這一函式可以用來送回除了前n個字元外的所有讀出標記。

yymore()

20110329

lex初學總結(二)

iii.lex 格式 這裡以乙個能分析類似c語言的lex程式原始碼 注釋來說明。在這裡定義re表示式 keyword if while do break true false int char bool real float switch case digit 0 9 letter a za z s...

編譯原理之初學Lex

初學編譯原理,老師布置了乙個小task 計算乙個文字中的字元數和行數。想著應該沒多難,結果最後因為種種也是搗鼓了蠻久的。不過有一說一倒是感覺這種先寫出一段 再用別的程式跑出來生成新的 之後執行的感覺蠻有意思的。等過兩天寫個yacc看看 或許到時候就不那麼想了。注意以下為.l檔案中的 a z 0 9 ...

MATLAB初學總結之一

a 1 2 3 4 建立乙個向量1,2,3,4與a 1,2,3,4 等效 與常數進行計算直接 t2 1即可 與向量進行計算,要先保證二者的行數和列數相等,具體可以去參考矩陣的乘法,相當於矩陣的行向量與列向量進行相乘。同時可以仿照c語言中陣列的操作形式來對向量中某一位的數字進行操作。檢視第二個元素t ...