lex學習筆記

2021-05-11 07:32:25 字數 1037 閱讀 2694

yyleng

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

yyless()

從與規則相關的**中呼叫yyless(n),這條規則推回除標記開頭的幾個字元以外的所有字元。當決定標記之間邊界的規則不方便表示為正規表示式時,它是很有用的

例: /"[^"]/" 

else }

yyless()的另一用處是使用不同的其實狀態的規則從新處理標記:

sometoken

yylex()

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

yylex()中的使用者**

規則段中的所有**都被拷貝到yylex()。以空白開始的行被假定是使用者**。"%%"後的**直接放置在接近掃瞄程式的開始處,在第一條執行的語句之前。

yymore()

每當詞法分析程式匹配標記時,標記的文字就儲存在以空字元結尾的字串yytext中

每次匹配乙個新的標記時,就要替換yytext的內容,如果yytext的內容還要使用,通過strdup()或者自己申請記憶體來儲存字串拷貝,從而使字串的拷貝拷貝位於剛剛分配的記憶體中。

yywrap()

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

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

起始狀態

在定義段可以宣告起始狀態,也稱起始狀態條件或起始規則。起始狀態用於限制某些規則的範疇,或者改變詞法分析程式處理部分檔案的方式。

沒有起始狀態的那些規則能應用於任何狀態。

動作中的begin語句設定了當前的起始狀態。

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

lex程式由三部分組成 定義段 規則段和使用者子例程式段 定義段.規則段.使用者子例程式段.這些部分由以兩個百分號組成的行分隔開。儘管某一部分可以為空,但前兩部分是必須的,第三部分和前面的 行可以忽略。定義段包括文字塊 定義 內部表宣告 起始條件和轉換。以空白開頭的行被逐字拷貝到c檔案中,通常,這用...

初步學習lex和yacc

因為是非計算機本科,所以沒有學編譯原理,進來想補補課,於是買了本 自製程式語言 裡面介紹了lex和yacc工具,於是裝起來試了下。原來用工具來解析字串還是挺方便的,以前知道正則以後,就覺得這東西很好,現在有了lex和yacc,把正則能做的事情又放大了,能夠做更豐富的事情。例如,寫乙個簡單的把字串裡的...

Lex快速入門

用lex語言表達的正規表示式 匹配任意字元,除了 n 換行 用來指定範圍。例如 a z 指從 a 到 z 之間的所有字元 a z 指從 a 到 z 之間的所有字元 0 9 指從 0 到 9 之間的所有字元 匹配 0個或者多個上述的模式。例如 ab 表示 a,ab,abb,abb.匹配 1個或者多個上...