青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

lex 命令

用途

生成一個與輸入流的簡單語法分析相匹配的 C 或 C++ 語言程序。

語法

lex [ -C ] [ -t ] [ -v| -n ] [ File... ]

描述

lex 命令讀取 File 或標準輸入,生成 C 語言程序并將它寫到一個名為 lex.yy.c 的文件中。這個文件,lex.yy.c ,是一個兼容的 C 語言的程序。一個 C++ 編譯器也能夠編譯 lex 命令的輸出。-C 標志將輸出文件重命名為 lex.yy.C 供 C++ 編譯器使用。

lex 命令生成的 C++ 程序可使用 STDIO 或 IOSTREAMS。如果在 C++ 編譯中,cpp 定義 _CPP_IOSTREAMS 是真,程序為所有 I/O 使用 IOSTREAMS。否則,使用 STDIO。

lex 命令使用包含在 File 中的規則和操作來生成一個程序,lex.yy.c,這個程序可用 cc 命令編譯。這個編譯過的 lex.yy.c 然后能接受輸入,將輸入分成為由在 File 文件中的規則定義的邏輯片,并運行包含在 File 文件中的操作的程序片斷。

這個生成的程序是一個稱為 yylex 的 C 語言函數。lex 命令將 yylex 函數存儲在一個名為 lex.yy.c 的文件中。可單獨用 yylex 函數來識別簡單的一個單詞的輸入,或能用它和其他 C 語言程序一起來執行更困難的輸入分析函數。例如,您能用 lex 命令來生成一個程序。這個程序能在將輸入流發送到一個由 yacc 命令生成的解析器程序之前簡化輸入流。

yylex 函數用稱為有限自動機的程序結構來分析輸入流。這個結構在一個時間允許程序僅在一個狀態(或條件)下退出。允許有有限個數目的狀態。在 File 中的規則確定程序怎樣從一個狀態移動到另一個狀態。

如果不指定一個 Filelex 命令讀取標準輸入。它將多個文件作為一個單個的文件對待。

注: 由于 lex 命令為中間和輸出文件使用固定的名稱,您可僅有一個由 lex 在給定目錄中生成的程序。

lex 規范文件

輸入文件文件包含三部分:定義規則用戶子例程。每部分必須用僅含定界符 %%(雙百分號)的行和其他部分分開。格式是:

下面描述了各自的用途和格式。

定義

如果想在您的規則中應用變量,必須在這個部分定義它們。變量組成左邊的列,它們的定義組成右邊的列。例如,如果想定義 D 作為數字,應該這樣寫:

D   [0-9]

您可用一個在 {} (大括號)內圍住變量名的規則部分定義的變量。

{D}

在以空格開頭或由 %{, %} 定界符行中括住的定義部分中的行被復制到 lex.yy.c 文件。能用這個構造聲明 C 語言變量用在 lex 操作或包含頭文件,例如:

%{
#include <math.h>
int count;
%}

這些行也可出現在規則部分的開頭部分,僅在第一個 %% 定界符之后,但它們不應當用在規則部分的其他地方。如果這行在 File 的定義部分,lex 命令將它復制到 lex.yy.c 文件的外部聲明部分。如果這行出現在規則部分,在第一個規則前,lex 命令將它復制到 lex.yy.c 文件的 yylex 子例程的本地聲明部分。那些行不能在第一個規則后出現。

lex 外部的類型,yytext,能通過在定義部分指定以下之一來設置為以空結束的字符數組(缺省)或者是以空結束字符串的指針:

%array    (缺省) %pointer

在定義部分,可為生成的有限狀態機設置表的大小。缺省大小對小程序足夠大。可能想為更復雜的程序設置更大的大小。

%an 轉變數是 n(缺省 5000)
%en 語法分析樹節點數是 n(缺省 2000)
%hn 多字節字符輸出槽數(缺省 0)
%kn 壓縮字符類數(缺省 1000)
%mn 多字節字符類輸出槽數(缺省 0)
%nn 狀態數是 n(缺省 2500)
%on 輸出槽數(缺省 5000,最小 257)
%pn 位置數是 n(缺省 5000)
%vp 在由 %h%m 控制的散列表中的空槽百分比(缺省 20,范圍 0 <= P < 100)
%zn 多字節字符類輸出槽數(缺省 0)

如果多字節字符出現在擴展的正則表達式字符串中,可能需要用 %o 參數復位輸出數組大小(可能的數組大小在 10,000 到 20,000 的范圍內)。這個復位反映相對于單字節字符數大得多的字符數。

如果多字節字符出現在一個擴展的正則表達式中,必須用 %h%m 參數設置多字節散列表大小為一個比包含在 lex 文件中的多字節字符總數更大的大小。

如果沒有多字節字符出現在擴展的規則表達式中,但是您想 '.' 來匹配多字節字符,必須設置 %z 大于零。類似的,對逆字符類(例如,[^abc])來匹配多字節字符,必須設置 %h%m 大于零。

當用多字節字符時,lex.yy.c 文件必須用 -qmbcs 編譯選項來編譯。

規則

一旦定義了條件,就可寫規則部分。它包含由 yylex 子例程來匹配的字符串和表達式,和當匹配時要執行的 C 命令。需要這一部分,這一部分必須由定界符 %%(雙百分號)開頭,不論是否有一個定義部分。lex 命令不識別沒有定界符的規則。

在這個部分,左邊列包含擴展正則表達式形式的模式。這些表達式可由在到 yylex 子例程的輸入文件中被識別。右邊的列包含一個當這個模式被識別時執行的 C 程序段,稱為一個操作

當詞法分析程序發現一個擴展的正則表達式的匹配,詞法分析程序執行與那個擴展正則表達式相關聯的操作。

模式可包含擴展的字符。如果多字節語言環境在系統中安裝,模式也可包含屬于安裝代碼集一部分的多字節字符。

列由跳格或空格分開。例如,如果想搜索關鍵字為 KEY 的文件,可輸入如下內容:

(KEY) printf ("found KEY");

如果在 File 文件中包含這個規則,yylex 詞法分析程序匹配模式 KEY 并運行 printf 子例程。

每個模式可有一個對應操作,既,當一個模式匹配時,一個 C 命令來執行。每個語句必須以 ;(分號)結束。如果在一個操作中用多于一條的語句,必須將它們包含在 { } (大括號)中。如果有個用戶子例程部分,第二個定界符 %%,必須跟著這個規則部分。如果沒有一個指定操作的模式匹配,詞法分析程序將在不更改輸入模式的情況下將之復制到輸出。

yylex 詞法分析程序在匹配一個輸入流中的一個字符串時,在它執行規則部分的任何命令前,它會將這個匹配的字符串復制到一個外部字符數組(或指向字符串的指針),yytext。類似的,外部的 int,yyleng,被設置為以字節表示的匹配字符串的長度(因此,多字節字符的大小大于 1)。

如想獲得如何形成擴展正則表達式的信息,請參閱在 《AIX V6.1 通用編程概念:編寫并調試程序》 中的『lex 命令中的擴展正則表達式』

用戶子例程

lex 庫定義下列子例程作為能在 lex 規范文件的規則部分用的宏。

input yyin 讀取字節。
unput 在讀取后替換一個字節。
output 寫一個輸出字節到 yyout
winput yyin 讀取多字節字符。
wunput 在讀取后替換一個多字節字符。
woutput 寫一個多字節輸出字符到 yyout
yysetlocale 調用 setlocale (LC_ALL " " ); 子例程來確定當前語言環境。

winputwunputwoutput 宏被定義來使用在 lex.yy.c 文件中編碼的 yywinputyywunputyywoutput 子例程。為了兼容性,那些 yy 子例程順序地使用 inputunputoutput 子例程用完全多字節字符來讀取、替換和寫必要的字節數。

能通過為在用戶子例程部分的例程寫自己的代碼來覆蓋那些宏。但是如果寫自己的,必須如下那樣在定義部分取消那些宏的定義:

%{
#undef input
#undef unput
#undef unput
#undef output
#undef winput
#undef wunput
#undef woutput
#undef yysetlocale
%}

lex.yy.c 中沒有 main 子例程,因為 lex 庫包含 main 子例程,而這個子例程調用 yylex 詞法分析程序和由 yylex()File 結束處調用的 yywrap 子例程。因此,如果在用戶子例程部分不包含 main()yywrap() 或兩者都不包含,當編譯 lex.yy.c 時,必須在 ll 調用 lex 庫的地方輸入 cclex.yy.c-ll

lex 命令生成的外部名稱都以 yy 開始,象在 yyinyyout yylexyytext 中那樣。

有限狀態機

有限狀態機的缺省骨架在 /usr/ccs/lib/lex/ncform 中定義。用戶可通過設置一個環境變量 LEXER=PATH. 使用一個個人配置的有限狀態機。PATH 變量指定用戶定義的有限狀態機路徑和文件名。lex 命令為變量檢查環境,如果它被設置,那么用補充的路徑。

在表達式中放置空格

一般的,空格或跳格結束一個規則,接著結束定義一個規則的表達式。然而,可在 " "(引號)內包括空格和跳格字符來在表達式中包含它們。用引號括住沒有在 [ ] (括號)集合中的表達式中的所有空格。

其他特殊字符

lex 程序識別許多正常的 C 語言特殊字符。這些字符序列是:

序列 含義
\a 提醒
\b 退格
\f 反饋表單
\n 換行符(在表達式中不用實際的換行符。)
\r 返回
\t 跳格
\v 縱向跳格
\\ 反斜杠
\digits 通過由 digits 指定 1、2、3 位的八進制整數表示的帶編碼的字符。
\xdigits 通過由 digits 指定的十六進制字符的序列表示的帶編碼的字符。
\c c 不是上面列出的字符的情況下,表示這個 c 字符未改變。

注:lex 規則中不使用 \0\x0

當在一個表達式中用這些特殊字符,不必將它們括到引號中。除了在 《AIX V6.1 通用編程概念:編寫并調試程序》 中的『lex 命令中的擴展正則表達式』中描述的特殊字符和運算符符號,所有字符總是一個文本字符。

匹配規則

當多于一個表達式可匹配當前輸入,lex 命令先選擇最長的匹配。當幾個規則匹配相同數目的字符,lex 命令選擇先出現的那個。例如,如果規則

integer    keyword action...;
[a-z]+       identifier action...;

以這個順序給出,integers 是輸入單詞,lex 匹配輸入作為一個標識,因為 [a-z]+ 匹配八個字符然而 integer 僅匹配七個字符。然而,輸入是 integer,兩個規則匹配七個字符。lex 選擇這個關鍵字規則因為它先出現。一個更短的輸入,如 int,不匹配整數表達式,所以 lex 選擇標識規則。

用通配符匹配一個字符串

因為 lex 先選擇最長的匹配,所以不使用包含像 .* 的表達式。例如:

'.*'

可能象是一個在單引號中識別一個字符串的好方法。然而,詞法分析程序讀取源頭,來查找一個遠的單引號來完成長匹配。如果帶這樣規則的詞法分析規則得到以下輸入:

'first' quoted string here, 'second' here

它匹配:

'first' quoted string here, 'second'

為了發現更短的字符串,firstsecond,使用以下規則:

'[^'\n]*'

這個規則在 'first' 后停止。

這個類型的錯誤不是遠到達,因為 .(句點)運算符不匹配換行字符。因此,像 .*(句號,星號)的表達式在當前行停止。不要試圖用像 [.\n]+ 這樣的表達式來使它失敗。詞法分析程序試圖讀取整個輸入文件,并且發生一個內部緩沖區溢出。

在字符串中查找字符串

lex 程序分割輸入流同時不搜索每個表達式的所有可能匹配。每個字符計算一次且僅一次。例如,計算 shehe 在輸入文本中的出現次數,嘗試以下規則:

she         s++
he          h++
\n          |.           ;

在這里最后兩個規則忽略除了 heshe 的所有東西。然而,因為 she 包含 helex 識別包含在 she 中的 he 的情況。

為覆蓋這個選擇,用 REJECT 操作。這個偽指令告訴 lex 轉到下一個規則。lex 然后在第一個規則被執行前調整輸入指針的位置到它在的地方,并執行第二個選擇規則。例如,計算包含 he 的實例,用以下規則:

she                 {s++;REJECT;}
he                  {h++;REJECT;}
\n                  |.                   ;

在計算完 she 的發生次數,lex 拒絕輸入流然后計算 he 的發生次數。因為在這種情況下,she 包含 he 但反之不然,可在 he 上省略 REJECT 操作。在其他情況下,確定哪個輸入字符在兩個類中可能較困難。

總之,無論何時 lex 的目的不是分割輸入流而是檢測在輸入中的某些項的所有示例,REJECT 總是有用的,并且這些項的實例可交迭或互相包含。

標志

-C 生成 lex.yy.C 文件而不是 lex.yy.c 以和 C++ 編譯器一起使用。為得到 I/O 流庫,使用宏 _CPP_IOSTREAMS
-n 禁止統計摘要。當為有限狀態機設置自己的表的大小時,如果您不選該標志,lex 命令自動生成這個摘要。
-t lex.yy.c 到標準輸出而不是到一個文件。
-v 提供一個生成的有限狀態機統計的一行摘要。

退出狀態

此命令返回以下退出值:

0 成功完成。
>0 有錯誤發生。

示例

  1. lexcommands 文件提取 lex 指令,并在 lex.yy.c 中放置輸出,用下列命令:

    lex lexcommands
  2. 創建一個 lex 程序,它將大寫轉換為小寫,刪除行尾空格,并用一個空格代替多個空格,在 lex 命令文件中包括下列內容:

    %%
    [A-Z]   putchar(yytext[0]+ 'a'-'A');
    [ ]+$ ;
    [ ]+    putchar(' '); 

文件

/usr/ccs/lib/libl.a 包含運行時庫。
/usr/ccs/lib/lex/ncform 定義一個有限狀態機。

posted on 2008-11-23 00:50 肥仔 閱讀(2148) 評論(0)  編輯 收藏 引用 所屬分類: LEX & YACC

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区三区在线视频| 久久福利精品| 亚洲男同1069视频| 久久久久久久综合日本| 欧美日韩国产精品专区| 国产一区二区高清视频| 亚洲美女91| 久久伊人精品天天| 亚洲一区二区三区高清| 欧美—级高清免费播放| 在线观看一区二区精品视频| 亚洲一区在线免费观看| 亚洲精品久久久久久久久久久久 | 国产一区导航| 久久亚洲综合网| 欧美电影专区| 影音先锋一区| 久久久久免费| 亚洲欧美一区二区视频| 国产精品家庭影院| 亚洲桃色在线一区| 日韩亚洲欧美成人一区| 欧美日本亚洲| 亚洲午夜精品福利| 欧美在线网址| 激情欧美国产欧美| 久久综合国产精品台湾中文娱乐网| 久久人人97超碰精品888| 国产欧美一区二区三区视频| 亚欧成人在线| 亚洲欧美精品一区| 亚洲精品日本| 99视频在线精品国自产拍免费观看| 亚洲自拍电影| 欧美一区二区三区日韩| 亚洲人妖在线| 国产一区二区日韩精品| 亚洲人成人一区二区三区| 国产综合欧美| 欧美大片在线观看| 欧美激情精品久久久六区热门| 亚洲精品乱码久久久久久黑人| 亚洲欧美一区二区三区久久 | 久久久久免费观看| 欧美一区二区三区免费看 | 久久综合久久综合这里只有精品| 精品白丝av| 亚洲婷婷综合久久一本伊一区| 国产精品日韩一区| 久久婷婷成人综合色| 国产精品久久久久aaaa九色| 最新日韩在线视频| 国产精品久久久久影院亚瑟| 久久精品免费播放| 久久青草欧美一区二区三区| 久久激情综合网| 国产精品久久久久久久久久直播| 亚洲精品影院在线观看| 国产欧美精品一区二区色综合| 亚洲美女色禁图| 中国成人黄色视屏| 欧美日韩在线视频一区| 久久精品网址| 国产日韩欧美视频| 亚洲国产日韩一区二区| 国产精品午夜国产小视频| 在线天堂一区av电影| 精品99视频| 久久色在线观看| 欧美国产视频日韩| 国产精品免费一区二区三区在线观看 | 亚洲精品一线二线三线无人区| 亚洲免费观看高清完整版在线观看熊 | 亚洲欧美激情视频| 久久综合色播五月| 欧美成人午夜| 一本大道久久精品懂色aⅴ| 久久国产精品亚洲va麻豆| 久久香蕉国产线看观看av| 尤物九九久久国产精品的特点| 久久亚洲国产精品日日av夜夜| 欧美成人精品激情在线观看| 国产精品久久一卡二卡| 亚洲欧美日韩一区在线观看| 国产精品亚洲аv天堂网 | 狠狠色综合日日| av不卡在线观看| 夜夜嗨av色综合久久久综合网| 国产精品黄视频| 久久疯狂做爰流白浆xx| 亚洲国产成人精品女人久久久| 国产在线精品二区| 免费久久99精品国产自| 麻豆国产精品一区二区三区| 亚洲大胆美女视频| 国产性色一区二区| 久久综合五月| 一区二区三区精品在线| 亚洲视频一区在线| 国产午夜亚洲精品羞羞网站| 欧美成黄导航| 午夜精品久久久久久久久久久久| 久久精品一区二区| 国产一区二区三区网站| 欧美成人精品一区| 亚洲欧美中文另类| 亚洲国产精品电影在线观看| 性欧美办公室18xxxxhd| 亚洲日本va在线观看| 久久久精品视频成人| 久久久久久久久一区二区| 亚洲精品资源| 黑丝一区二区| 国产精品久久99| 欧美激情影音先锋| 久久精品一区二区三区不卡牛牛| 一本色道久久88亚洲综合88| 免费日韩av| 日韩午夜av在线| 国产精品xxxxx| 午夜在线精品| 男人的天堂亚洲在线| 亚洲在线播放电影| 亚洲狼人综合| 永久免费精品影视网站| 国产欧美综合在线| 欧美视频免费在线| 欧美日韩理论| 欧美一区午夜精品| 亚洲高清不卡在线| 美女国内精品自产拍在线播放| 午夜一级久久| 亚洲欧美国产高清va在线播| 亚洲免费大片| 日韩视频中文| 99日韩精品| 亚洲最新色图| 亚洲视频在线观看一区| 99在线精品观看| 亚洲性视频网址| 亚洲一区二区三区四区中文 | 亚洲一区二区三区在线视频| 这里是久久伊人| 国内外成人在线视频| 国产视频丨精品|在线观看| 国产精品一卡二卡| 欧美成人亚洲成人| 欧美肥婆在线| 欧美国产先锋| 欧美日韩99| 国产精品综合色区在线观看| 国产欧美日韩专区发布| 国产视频一区三区| 激情久久久久久久| 亚洲肉体裸体xxxx137| 国产综合18久久久久久| 欧美大片专区| 亚洲精品久久久久久久久久久久| 亚洲日韩视频| 在线午夜精品| 久久精品亚洲精品| 麻豆精品视频在线观看| 亚洲尤物影院| 欧美一区二区三区四区在线| 久久婷婷国产麻豆91天堂| 欧美不卡激情三级在线观看| 欧美日韩午夜在线| 国产一区二区激情| 亚洲精品美女在线观看| 亚洲伊人色欲综合网| 久久久91精品| 亚洲国产清纯| 亚洲欧美日韩在线| 欧美成人综合| 国产美女精品视频免费观看| 在线成人av.com| 在线综合+亚洲+欧美中文字幕| 午夜一区在线| 亚洲国产二区| 亚洲一区二区成人在线观看| 快播亚洲色图| 国产精品丝袜91| 亚洲精品欧美日韩| 久久国产精品99久久久久久老狼| 午夜精品视频在线观看一区二区| 亚洲一二三级电影| 久久一区二区三区四区| 亚洲日本中文字幕区| 久久av资源网站| 国产精品草草| 亚洲精品欧美激情| 久久精品日产第一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美午夜精品理论片a级按摩| 精品成人在线观看| 亚洲欧美综合| 99热免费精品| 欧美大片一区二区三区| 伊人激情综合| 欧美专区日韩视频|