lex 文件結構
lex 文件命名通常以 .l 結尾粘都,共分為三個部分佃声,由 %%
分割澎剥。
聲明部分
%{
會被原封不動拷貝到生成的文件中
%}
選項設置及預定義一些常用的模式
%%
規(guī)則定義部分叭首,一個規(guī)則包含一個模式和一個動作
REG
{C 語言代碼, return 一個 Token
}
其中 reg 是正則表達式模式疤苹,每讀取的字符匹配了一個模式互广,就執(zhí)行規(guī)則 {}
里面的動作代碼,返回一個 TOKEN卧土。其中模式必須出現(xiàn)在行首惫皱,如果有倆個模式匹配,則選取其中最長的尤莺,也就是最長匹配原則
規(guī)則定義部分逸吵,也可以包含一個 %{ C 代碼 %}
塊,其中的 C 代碼會被執(zhí)行一次缝裁,這通成ㄖ澹可以用來返回一個 TOKEN足绅,這個 TOKEN 會加在所有的 TOKEN 之前
%%
子例程,也就是 C 語言的 函數(shù)定義韩脑,會被拷貝到生成的此法額分析器 C 代碼中
Flex
三層輸入
默認使用標準輸入或者yyin文件句柄讀取氢妈,yyrestart() 重置輸入狀態(tài),用來讀取多個輸入文件段多。
創(chuàng)建并使用 YY_BUFFER_STATE 輸入緩沖區(qū)
-
#define YY_INPUT(buf, result, max_size)
當詞法分析器的輸入緩沖區(qū)為空時首量,就會調(diào)用 YY_INPUT,buf 是緩存區(qū)进苍,result 等于實際存放在緩沖區(qū)的字符大小加缘,max_size 緩存區(qū)的最大值。定義部分就是要把字符串拷貝到 buf 中觉啊。YY_INPUT 一般用于輸入來自于其他一些內(nèi)容拣宏,而這些內(nèi)容無法預先載入字符串緩沖區(qū)且無法支持標準輸入輸出。
狀態(tài)
定義:%x杠人,%s
切換:BEGIN(S)
Bison
每次規(guī)約就會執(zhí)行規(guī)則相關聯(lián)的動作
yyparse() 會調(diào)用yylex()獲取記號勋乾,yyval 或得記號值。