Lex:修订间差异
小 機器人:修正錯誤050(en dash or em dash) |
Clod Huang(留言 | 贡献) 小 →lex |
||
(未显示18个用户的23个中间版本) | |||
第1行: | 第1行: | ||
{{lowercase |
{{lowercase}} |
||
{{noteTA|G1=IT}} |
|||
⚫ | 在 |
||
{{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 & |
| 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 |
|||
⚫ | |||
| 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 |
|||
⚫ | |||
Lex讀進一個代表詞法分析器規則的輸入[[字串流]],然後輸出以[[C語言]]實做的詞法分析器[[原始碼]]。 |
Lex讀進一個代表詞法分析器規則的輸入[[字串流]],然後輸出以[[C語言]]實做的詞法分析器[[原始碼]]。 |
||
雖然傳統上是商業軟體,但是有些根據原本AT&T程式碼這些版本的Lex可以以[[公開原始碼]]的形式獲得,並被視為某些系統的一部份,例如說[[OpenSolaris]]和[[貝爾實驗室九號計畫]]。 |
雖然傳統上是商業軟體,但是有些根據原本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的[[陳述 (程式)|陳述]](statement)串連在一起。這一些樣式都是[[正規表式]]。當lexer看到輸入裡面有合乎給定的樣式時,則會操作相對應的C程式碼。這就是lex運作的基礎。 |
||
*'''C程式碼'''區塊 |
*'''C程式碼'''區塊包含C的陳述與[[子程式|函式]](function)會原封不動的照搬到產生出來的C原始碼裡面。這些陳述一般假設包含了在規則區塊裡面,各個規則分別呼叫的原始碼。在大型程式裡面,將這一些程式放在其他分開的檔案並且在[[編譯器|編譯]]階段作連接會更方便(在進行修改跟擴充的時候)。 |
||
==lex |
==lex文件示例== |
||
下 |
下面是一个[[flex]]版本的lex文件的示例。这个程序可以找出表示数字(整数)的字符串,并将它们打印出来。 |
||
<!--這裡面程式碼的註解我也順便翻譯成為中文,方便大家閱讀--> |
<!--這裡面程式碼的註解我也順便翻譯成為中文,方便大家閱讀--> |
||
< |
<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; |
||
}</ |
}</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和語法分析產生程式 |
===Lex和語法分析產生程式(parser generator)並用=== |
||
Lex和語法分析器產生程式,例如說[[Yacc]]或者[[GNU bison|Bison]]之類,常常一起使用。 |
Lex和語法分析器產生程式,例如說[[Yacc]]或者[[GNU bison|Bison]]之類,常常一起使用。語法分析器產生程式使用[[形式文法]]來分析輸入字串流(input stream),這是Lex使用簡單的[[正規表示式]]所作不到的事情(Lex的設計被限制於只能使用[[有限狀態自動機]])。然而,語法分析器產生程式不能直接讀取簡單的輸入字串流–他們需要使用一系列的單詞(token)。Lex則常常被使用來提供語法分析器產生程式這一些單詞。 |
||
===Lex和make=== |
===Lex和make=== |
||
[[make]]是一個便利程式 |
[[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 |
|||
⚫ | |||
|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 |
|||
⚫ | |||
==相關條目== |
==相關條目== |
||
*[[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|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: |
[[Category:编译工具]] |
||
[[Category: |
[[Category:分析器生成器]] |
||
[[Category:Unix |
[[Category:Unix编程工具]] |
||
[[Category:Unix SUS2008 |
[[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的最新版本
原作者 | Mike Lesk, Eric Schmidt |
---|---|
首次发布 | 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]
相關條目
[编辑]参考文献
[编辑]- ^ 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).
- ^ Levine, John. flex & bison. O'Reilly Media. August 2009: 304 [2010-03-16]. ISBN 978-0-596-15597-1. (原始内容存档于2011-08-16).
- ^ 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)