跳转到内容

Lex:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
ALBot留言 | 贡献
機器人:修正錯誤050(en dash or em dash)
lex
标签移动版编辑 移动应用程序编辑 Android应用编辑
 
(未显示18个用户的23个中间版本)
第1行: 第1行:
{{lowercase|title=lex programming tool}}
{{lowercase}}
{{noteTA|G1=IT}}
[[電腦科學]]裡面,'''lex'''是一個產生[[詞法分析]](lexical analyzer) ("掃描器"(scanners)或者"lexers")的[[電腦程式|程式]]。<ref>{{cite book|last1=Levine|first1=John R |first2= Tony |last2=Mason |first3=Doug |last3=Brown|title=LEX & YACC|pages=1–2|publisher=[[O'Reilly Media|O'Reilly]]|year=1992|edition=2|isbn=1-56592-000-7|url=http://books.google.co.in/books?id=YrzpxNYegEkC&printsec=frontcover#PPA1,M1}}</ref><ref>{{Cite book
{{not|蕾丝|LexBurner}}
{{Infobox Software
| name = Lex
| logo =
| screenshot =
| screenshot size =
| caption =
| author = [[Mike Lesk]], [[Eric Schmidt]]
| developer =
| released = {{Start date and age|1975}}
| latest release version =
| latest release date =
| operating system = [[Unix]]和[[类Unix系统]]
| genre = [[命令 (计算机)|命令]]
| license =
| website =
}}
在[[電腦科學]]裡面,'''lex'''是一個產生[[詞法分析]]器(lexical analyzer,"掃描器"(scanners)或者"lexers"的[[電腦程式|程式]]。<ref>{{cite book|last1=Levine|first1=John R|first2=Tony|last2=Mason|first3=Doug|last3=Brown|title=LEX & YACC|pages=1–2|publisher=[[O'Reilly Media|O'Reilly]]|year=1992|edition=2|isbn=1-56592-000-7|url=http://books.google.co.in/books?id=YrzpxNYegEkC&printsec=frontcover#PPA1,M1|access-date=2010-03-16|archive-date=2014-12-02|archive-url=https://web.archive.org/web/20141202081120/http://books.google.co.in/books?id=YrzpxNYegEkC&printsec=frontcover#PPA1,M1|dead-url=no}}</ref><ref>{{Cite book
| last = Levine
| last = Levine
| first = John
| first = John
| authorlink = John Levine
| authorlink = John Levine
| coauthors =
| coauthors =
| title = flex &amp; bison
| title = flex & bison
| publisher = O'Reilly Media
| publisher = O'Reilly Media
| date = August 2009
| date = August 2009
| location =
| location =
| pages = 304
| pages = 304
第13行: 第31行:
| doi =
| doi =
| id =
| id =
| isbn = 978-0-596-15597-1
| isbn = 978-0-596-15597-1}}</ref> Lex常常與[[yacc]] [[語法分析器產生程式]](parser generator)一起使用。 Lex(最早是[[埃里克·施密特]]和[[Mike Lesk]]製作)是許多[[UNIX]]系統的標準[[詞法分析器]](lexical analyzer)產生程式,而且這個工具所作的行為被詳列為[[POSIX]]標準的一部分。
| access-date = 2010-03-16
| archive-date = 2011-08-16
| archive-url = https://web.archive.org/web/20110816025643/http://oreilly.com/catalog/9780596155988
| dead-url = no
}}</ref> Lex常常與[[yacc]] [[語法分析器產生程式]](parser generator)一起使用。Lex(最早是[[埃里克·施密特]]和[[迈克·莱斯克]]製作是許多[[UNIX]]系統的標準[[詞法分析器]](lexical analyzer)產生程式,而且這個工具所作的行為被詳列為[[POSIX]]標準的一部分。


Lex讀進一個代表詞法分析器規則的輸入[[字串流]],然後輸出以[[C語言]]實做的詞法分析器[[原始碼]]。
Lex讀進一個代表詞法分析器規則的輸入[[字串流]],然後輸出以[[C語言]]實做的詞法分析器[[原始碼]]。


雖然傳統上是商業軟體,但是有些根據原本AT&T程式碼這些版本的Lex可以以[[公開原始碼]]的形式獲得,並被視為某些系統的一部份,例如說[[OpenSolaris]]和[[貝爾實驗室九號計畫]]。 另一個有名的Lex[[公開原始碼]]版本是[[flex]],代表"快速的詞法分析器"(fast lexical analyzer)
雖然傳統上是商業軟體,但是有些根據原本AT&T程式碼這些版本的Lex可以以[[公開原始碼]]的形式獲得,並被視為某些系統的一部份,例如說[[OpenSolaris]]和[[貝爾實驗室九號計畫]]。另一個有名的Lex[[公開原始碼]]版本是[[flex詞法分析器|flex]],代表"快速的詞法分析器"(fast lexical analyzer)


==lex檔案的結構==
==lex檔案的結構==
lex的檔案結構故意設計的與yacc的檔案格式相似;檔案分成三個區塊, 均以一個只有兩個百分比符號(%)的單行來分隔,如下:
lex的檔案結構故意設計的與yacc的檔案格式相似;檔案分成三個區塊均以一個只有兩個百分比符號%的單行來分隔,如下:
''定義區塊''
''定義區塊''
%%
%%
第27行: 第50行:
''C程式碼區塊''
''C程式碼區塊''


*'''定義'''區塊是用來定義 [[巨集]]以及匯入[[C語言|C]]寫成的[[表頭檔]]所在區塊。在這裡面也可以寫一些C程式碼,這一些程式碼會被複製到產生出來的C原始碼的開頭部份。
*'''定義'''區塊是用來定義[[巨集]]以及匯入[[C語言|C]]寫成的[[表頭檔]]所在區塊。在這裡面也可以寫一些C程式碼,這一些程式碼會被複製到產生出來的C原始碼的開頭部份。
*'''規則'''區塊是最重要的區塊;這裡將樣式與C的[[陳述 (程式)|陳述]](statement)串連在一起。這一些樣式都是[[正規表式]]。當lexer看到輸入裡面有合乎給定的樣式時,則會操作相對應的C程式碼。這就是lex運作的基礎。
*'''規則'''區塊是最重要的區塊;這裡將樣式與C的[[陳述 (程式)|陳述]](statement)串連在一起。這一些樣式都是[[正規表式]]。當lexer看到輸入裡面有合乎給定的樣式時,則會操作相對應的C程式碼。這就是lex運作的基礎。
*'''C程式碼'''區塊 包含C的陳述與[[子程式|函式]](function)會原封不動的照搬到產生出來的C原始碼裡面。這些陳述一般假設包含了在規則區塊裡面,各個規則分別呼叫的原始碼。在大型程式裡面,將這一些程式放在其他分開的檔案並且在[[編譯器|編譯]]階段作連接會更方便(在進行修改跟擴充的時候)
*'''C程式碼'''區塊包含C的陳述與[[子程式|函式]](function)會原封不動的照搬到產生出來的C原始碼裡面。這些陳述一般假設包含了在規則區塊裡面,各個規則分別呼叫的原始碼。在大型程式裡面,將這一些程式放在其他分開的檔案並且在[[編譯器|編譯]]階段作連接會更方便在進行修改跟擴充的時候


==lex檔案的範例==
==lex文件示例==
是一[[flex]] 版本的lex例。這隻式分辨哪裡是表示(數)的字串,並且把他們印出
是一[[flex]]版本的lex文件例。这个序可以找出表示数)的字串,并将它们打印出
<!--這裡面程式碼的註解我也順便翻譯成為中文,方便大家閱讀-->
<!--這裡面程式碼的註解我也順便翻譯成為中文,方便大家閱讀-->
<pre>/*** 定義區塊 ***/
<syntaxhighlight lang="c">/*** 定義區塊***/


%{
%{
第41行: 第64行:
%}
%}


/* 這裡告訴flex只要讀取輸入的檔案(不需要其他檔案)*/
/* 這裡告訴flex只要讀取輸入的檔案不需要其他檔案*/
%option noyywrap
%option noyywrap


%%
%%
/*** 規則區塊 ***/
/*** 規則區塊***/


/* [0-9]+ 代表包含一個或多個數字的字串 */
/* [0-9]+代表包含一個或多個數字的字串*/
[0-9]+ {
[0-9]+ {
/* yytext 是一個字串變數,內容是符合規則的字串本身。 */
/* yytext是一個字串變數,內容是符合規則的字串本身。*/
printf("Saw an integer: %s\n", yytext);
printf("Saw an integer: %s\n", yytext);
}
}


. { /* 忽略所有其他的字 */ }
. { /* 忽略所有其他的字*/ }


%%
%%
第63行: 第86行:
yylex();
yylex();
return 0;
return 0;
}</pre>
}</syntaxhighlight>


將這個檔案輸入給flex,它會將這個檔案轉換成一個C檔案,檔名lex.yy.c。這個C檔案可以被編譯成一份可執行檔,功能為找出並且輸出代表整數的字串。 例如,給定輸入:
將這個檔案輸入給flex,它會將這個檔案轉換成一個C檔案,檔名lex.yy.c。這個C檔案可以被編譯成一份可執行檔,功能為找出並且輸出代表整數的字串。例如,給定輸入
abc123z.!&*2ghj6
abc123z.!&*2ghj6
這隻程式會印出:
這隻程式會印出
Saw an integer: 123
Saw an integer: 123
Saw an integer: 2
Saw an integer: 2
第73行: 第96行:


==Lex和其他工具並用==
==Lex和其他工具並用==
===Lex和語法分析產生程式(parser generator)並用===
===Lex和語法分析產生程式(parser generator)並用===
Lex和語法分析器產生程式,例如說[[Yacc]]或者[[GNU bison|Bison]]之類,常常一起使用。 語法分析器產生程式使用[[形式文法]]來分析輸入字串流(input stream),這是Lex使用簡單的[[正規表示式]]所作不到的事情 (Lex的設計被限制於只能使用[[有限狀態自動機]])。然而,語法分析器產生程式不能直接讀取簡單的輸入字串流– 他們需要使用一系列的單詞(token) Lex則常常被使用來提供語法分析器產生程式這一些單詞。
Lex和語法分析器產生程式,例如說[[Yacc]]或者[[GNU bison|Bison]]之類,常常一起使用。語法分析器產生程式使用[[形式文法]]來分析輸入字串流(input stream),這是Lex使用簡單的[[正規表示式]]所作不到的事情(Lex的設計被限制於只能使用[[有限狀態自動機]]。然而,語法分析器產生程式不能直接讀取簡單的輸入字串流–他們需要使用一系列的單詞(token)。Lex則常常被使用來提供語法分析器產生程式這一些單詞。


===Lex和make===
===Lex和make===
[[make]]是一個便利程式(utility),在這裡我們用它來維護跟lex相關的程式。make假設副檔名是<code>.l</code>的檔案是一個lex原始碼檔案。make內部的巨集<code>LFLAGS</code>可以用來詳列make自動觸發的lex選項。<ref>{{citation
[[make]]是一個便利程式(utility),在這裡我們用它來維護跟lex相關的程式。make假設副檔名是<code>.l</code>的檔案是一個lex原始碼檔案。make內部的巨集<code>LFLAGS</code>可以用來詳列make自動觸發的lex選項。<ref>{{citation
|url=http://www.opengroup.org/onlinepubs/009695399/utilities/make.html
|url=http://www.opengroup.org/onlinepubs/009695399/utilities/make.html
|title=make
|title=make
第83行: 第106行:
|publisher=The IEEE and The Open Group
|publisher=The IEEE and The Open Group
|date=2004
|date=2004
|accessdate=2010-03-16
}}</ref>
|archive-date=2010-10-31
|archive-url=https://web.archive.org/web/20101031131616/http://www.opengroup.org/onlinepubs/009695399/utilities/make.html
|dead-url=no
}}</ref>


==相關條目==
==相關條目==
*[[flex詞法分析器]]
*[[Flex lexical analyser]]
*[[Yacc]]
*[[Yacc]]
*[[Ragel]]
*[[Ragel]]
第92行: 第119行:
*[[List of C Sharp lexer generators|List of C# lexer generators]]
*[[List of C Sharp lexer generators|List of C# lexer generators]]


==項目==
==文献 ==
{{reflist}}
{{Reflist|30em}}


==外部連==
==外部連==
*[http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/ Using Flex and Bison at Macworld.com]
*[http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/ Using Flex and Bison at Macworld.com] {{Wayback|url=http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/ |date=20050705073522 }}


[[Category:Compiling tools]]
[[Category:编译工具]]
[[Category:Parser generators]]
[[Category:分析器生成器]]
[[Category:Unix programming tools]]
[[Category:Unix编程工具]]
[[Category:Unix SUS2008 utilities]]
[[Category:Unix SUS2008实用工具]]
[[Category:程序設計工具]]

[[cs:Lex (software)]]
[[de:Lex (Informatik)]]
[[en:Lex (software)]]
[[es:Lex (informática)]]
[[fa:لکس]]
[[hu:Lex (informatika)]]
[[ja:Lex]]
[[ko:Lex]]
[[nl:Lex (computerprogramma)]]
[[pl:Lex (informatyka)]]
[[ru:Lex]]
[[sr:Lex]]

2021年2月17日 (三) 01:31的最新版本

Lex
原作者Mike Lesk, Eric Schmidt
首次发布1975年,​49年前​(1975
源代码库 編輯維基數據鏈接
操作系统Unix类Unix系统
类型命令

電腦科學裡面,lex是一個產生詞法分析器(lexical analyzer,"掃描器"(scanners)或者"lexers")的程式[1][2] Lex常常與yacc 語法分析器產生程式(parser generator)一起使用。Lex(最早是埃里克·施密特迈克·莱斯克製作)是許多UNIX系統的標準詞法分析器(lexical analyzer)產生程式,而且這個工具所作的行為被詳列為POSIX標準的一部分。

Lex讀進一個代表詞法分析器規則的輸入字串流,然後輸出以C語言實做的詞法分析器原始碼

雖然傳統上是商業軟體,但是有些根據原本AT&T程式碼這些版本的Lex可以以公開原始碼的形式獲得,並被視為某些系統的一部份,例如說OpenSolaris貝爾實驗室九號計畫。另一個有名的Lex公開原始碼版本是flex,代表"快速的詞法分析器"(fast lexical analyzer)

lex檔案的結構

[编辑]

lex的檔案結構故意設計的與yacc的檔案格式相似;檔案分成三個區塊,均以一個只有兩個百分比符號(%)的單行來分隔,如下:

定義區塊
%%
規則區塊
%%
C程式碼區塊
  • 定義區塊是用來定義巨集以及匯入C寫成的表頭檔所在區塊。在這裡面也可以寫一些C程式碼,這一些程式碼會被複製到產生出來的C原始碼的開頭部份。
  • 規則區塊是最重要的區塊;這裡將樣式與C的陳述(statement)串連在一起。這一些樣式都是正規表式。當lexer看到輸入裡面有合乎給定的樣式時,則會操作相對應的C程式碼。這就是lex運作的基礎。
  • C程式碼區塊包含C的陳述與函式(function)會原封不動的照搬到產生出來的C原始碼裡面。這些陳述一般假設包含了在規則區塊裡面,各個規則分別呼叫的原始碼。在大型程式裡面,將這一些程式放在其他分開的檔案並且在編譯階段作連接會更方便(在進行修改跟擴充的時候)。

lex文件示例

[编辑]

下面是一个flex版本的lex文件的示例。这个程序可以找出表示数字(整数)的字符串,并将它们打印出来。

/*** 定義區塊***/

%{
/* 會直接照搬放檔頭的C code */
#include <stdio.h>
%}

/* 這裡告訴flex只要讀取輸入的檔案(不需要其他檔案)*/
%option noyywrap

%%
    /*** 規則區塊***/

    /* [0-9]+代表包含一個或多個數字的字串*/
[0-9]+  {
            /* yytext是一個字串變數,內容是符合規則的字串本身。*/
            printf("Saw an integer: %s\n", yytext);
        }

.       {   /* 忽略所有其他的字*/   }

%%
/*** C程式碼區塊***/

int main(void)
{
    /* 呼叫lexer,然後結束程式*/
    yylex();
    return 0;
}

將這個檔案輸入給flex,它會將這個檔案轉換成一個C檔案,檔名lex.yy.c。這個C檔案可以被編譯成一份可執行檔,功能為找出並且輸出代表整數的字串。例如,給定輸入:

abc123z.!&*2ghj6

這隻程式會印出:

Saw an integer: 123
Saw an integer: 2
Saw an integer: 6

Lex和其他工具並用

[编辑]

Lex和語法分析產生程式(parser generator)並用

[编辑]

Lex和語法分析器產生程式,例如說Yacc或者Bison之類,常常一起使用。語法分析器產生程式使用形式文法來分析輸入字串流(input stream),這是Lex使用簡單的正規表示式所作不到的事情(Lex的設計被限制於只能使用有限狀態自動機)。然而,語法分析器產生程式不能直接讀取簡單的輸入字串流–他們需要使用一系列的單詞(token)。Lex則常常被使用來提供語法分析器產生程式這一些單詞。

Lex和make

[编辑]

make是一個便利程式(utility),在這裡我們用它來維護跟lex相關的程式。make假設副檔名是.l的檔案是一個lex原始碼檔案。make內部的巨集LFLAGS可以用來詳列make自動觸發的lex選項。[3]

相關條目

[编辑]

参考文献

[编辑]
  1. ^ Levine, John R; Mason, Tony; Brown, Doug. LEX & YACC 2. O'Reilly. 1992: 1–2 [2010-03-16]. ISBN 1-56592-000-7. (原始内容存档于2014-12-02). 
  2. ^ Levine, John. flex & bison. O'Reilly Media. August 2009: 304 [2010-03-16]. ISBN 978-0-596-15597-1. (原始内容存档于2011-08-16). 
  3. ^ make, The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition (The IEEE and The Open Group), 2004 [2010-03-16], (原始内容存档于2010-10-31) 

外部連結

[编辑]