最近在學習編譯原理,寫些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 ...