2 09 Flex單個程式中的多重詞法分析器

2021-10-05 23:39:39 字數 1333 閱讀 9013

你可能希望在同乙個程式中使用兩個部分或者完全不同的記號語法。乙個互動式除錯直譯器可能需要乙個詞法分析器用於程式語言,還需要另外乙個詞法分析器用於除錯命令。

有兩種基本的方法來使乙個程式處理兩個詞法分析器:合併的詞法分析器或者把兩個完整的詞法分析器放到程式中

合併的詞法分析器

你可以使用起始狀態合併兩個詞法分析器。每個詞法分析器的模式都被加上特定起始狀態作為字首。當詞法分析器開始工作時,你需要寫一小段**來讓 它進入合適的初始狀態,這樣就可以選擇特定的詞法分析器了,例如下面這一段**(它將會被拷貝到yylex()的開頭):

%s inita initb initc%%

%if(first_tok)%}

%%

這種合併的詞法分析器與合併的語法分析器結合使用時,你通常需要通過**來產生初始記號,以便於告知語法分析器那種語法正在使用。這種方法的有點是目標**比較小。缺點就是其因為共享而引入的複雜性,你需要非常小心使用起始狀態;你不能夠一次啟用兩種詞法分析器;對於不同詞法分析器使用不同的輸入源的情況處理會比較麻煩。

同乙個程式中的多個完整的詞法分析器

另外一種方法是在你的程式中包含兩個詞法分析器。這種技巧要求改變lex預設使用的函式和變數名,這樣兩個詞法分析器才可以分別生成,然後編譯到同乙個程式中。

flex提供了命令列選項和程式選項來改變生成的詞法分析器所使用的名字的字首。例如,下面這些選項可以讓flex使用字首"foo"而不是"yy",並且生成的詞法分析器原始檔會是foolex.c。

%option prefix=

"foo"

%option outfile=

"foolex.c"

你也可以通過命令列選項來實現這一點:

flex --outfile=foolex.c --prefix=foo foo.l
任何一種方法生成的詞法分析器又具有入口函式foolex(),它從標準檔案fooin讀取輸入。不過稍微有點兒迷惑人的是,flex需要在詞法分析器的最前面生成一大堆#define巨集,它們會把標準的"yy"格式的名字重定義為選定的字首格式。這使得你可以繼續使用標準名字來編寫你的詞法分析器,而外部可見的名字則會使用選定的字首。例如:

#define yyin fooin

#define yyleng fooleng

#define yylex foolex

#define yyout fooout

#define yytext footext

#define yylineno foolineno

FLEX程式如何改變程式中單個動畫的幀速

在flex程式中,必須有乙個主程式元件,相當於c語言中的main函式,也就是函式的入口。在這個入口處可以設定程式中動畫的幀速。上面這條語句將程式中的動畫設定為每秒10幀。現在我們要做的一件事情是如何改變程式中某乙個元件的動畫的幀速,比如我們有乙個元件。width 600 height 400 完之後...

flex彈性布局在小程式中的使用

採用flex布局的元素,稱為flex容器 flex container 簡稱 容器 它的所有子元素自動成為容器成員,稱為flex專案 flex item 簡稱 專案 任何乙個元素都可以指定為flex布局 display flex inline flex 定義彈性伸縮盒容器型別 flex 將物件作為塊...

程式中,呼叫Bison和Flex結合的小例子

網上的很多程式,對初次接觸bison和flex的人而言,都有點複雜,看最簡單的例子更好些 我稍微修改一下,說說自己的理解,也作為乙個備忘 flex程式 1 root lex total cat lexer.l 2 12 13 digit 0 9 14 1516 17 18 19 2021 22voi...