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個或者多個上...