Lex:修订间差异
Flamerecca(留言 | 贡献) |
Clod Huang(留言 | 贡献) 小 →lex |
||
(未显示23个用户的36个中间版本) | |||
第1行: | 第1行: | ||
{{lowercase}} |
|||
{{notchinese|time=2010-03-16T02:07:58+00:00}} |
|||
{{noteTA|G1=IT}} |
|||
{{Translating |time=2010-03-16T02:09:30+00:00 }} |
|||
{{not|蕾丝|LexBurner}} |
|||
{{lowercase|title=lex programming tool}} |
|||
{{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 |
||
第15行: | 第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 reads an input [[stream (computing)|stream]] specifying the lexical analyzer and outputs [[原始碼]] implementing the lexer in the [[C (programming language)|C programming language]]. |
|||
雖然傳統上是商業軟體,但是有些根據原本AT&T程式碼這些版本的Lex可以以[[公開原始碼]]的形式獲得,並被視為某些系統的一部份,例如說[[OpenSolaris]]和[[貝爾實驗室九號計畫]]。另一個有名的Lex[[公開原始碼]]版本是[[flex詞法分析器|flex]],代表"快速的詞法分析器"(fast lexical analyzer) |
|||
Though traditionally proprietary software, versions of Lex based on the original AT&T code are available as [[公開原始碼]], as part of systems such as [[OpenSolaris]] and [[Plan 9 from Bell Labs]]. Another popular [[公開原始碼]] version of Lex is [[flex lexical analyser|Flex]], the "fast lexical analyzer". |
|||
==lex檔案的結構== |
==lex檔案的結構== |
||
lex的檔案結構故意設計的與yacc的檔案格式相似;檔案分成三個區塊,均以一個只有兩個百分比符號(%)的單行來分隔,如下: |
|||
The structure of a lex file is intentionally similar to that of a yacc file; files are divided up into three sections, separated by lines that contain only two 百分比符號,如下: |
|||
''定義區塊'' |
''定義區塊'' |
||
%% |
%% |
||
第29行: | 第50行: | ||
''C程式碼區塊'' |
''C程式碼區塊'' |
||
* |
*'''定義'''區塊是用來定義[[巨集]]以及匯入[[C語言|C]]寫成的[[表頭檔]]所在區塊。在這裡面也可以寫一些C程式碼,這一些程式碼會被複製到產生出來的C原始碼的開頭部份。 |
||
*'''規則'''區塊是最重要的區塊;這裡將樣式與C的[[陳述 (程式)|陳述]](statement)串連在一起。這一些樣式都是[[正規表式]]。當lexer看到輸入裡面有合乎給定的樣式時,則會操作相對應的C程式碼。這就是lex運作的基礎。 |
|||
*The '''rules''' section is the most important section; it associates patterns with C [[statement (programming)|statement]]s. Patterns are simply [[regular expression]]s. When the lexer sees some text in the input matching a given pattern, it executes the associated C code. This is the basis of how lex operates. |
|||
*'''C程式碼'''區塊包含C的陳述與[[子程式|函式]](function)會原封不動的照搬到產生出來的C原始碼裡面。這些陳述一般假設包含了在規則區塊裡面,各個規則分別呼叫的原始碼。在大型程式裡面,將這一些程式放在其他分開的檔案並且在[[編譯器|編譯]]階段作連接會更方便(在進行修改跟擴充的時候)。 |
|||
*The '''C code''' section contains C statements and [[function (programming)|function]]s that are copied verbatim to the generated source file. These statements presumably contain code called by the rules in the rules section. In large programs it is more convenient to place this code in a separate file and link it in at [[compiler|compile]] time. |
|||
==lex |
==lex文件示例== |
||
下 |
下面是一个[[flex]]版本的lex文件的示例。这个程序可以找出表示数字(整数)的字符串,并将它们打印出来。 |
||
<!--這裡面程式碼的註解我也順便翻譯成為中文,方便大家閱讀--> |
|||
< |
<syntaxhighlight lang="c">/*** 定義區塊***/ |
||
%{ |
%{ |
||
/* 會直接照搬放檔頭的C code */ |
|||
/* C code to be copied verbatim */ |
|||
#include <stdio.h> |
#include <stdio.h> |
||
%} |
%} |
||
/* 這裡告訴flex只要讀取輸入的檔案(不需要其他檔案)*/ |
|||
/* This tells flex to read only one input file */ |
|||
%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); |
||
} |
} |
||
. { /* |
. { /* 忽略所有其他的字*/ } |
||
%% |
%% |
||
第62行: | 第83行: | ||
int main(void) |
int main(void) |
||
{ |
{ |
||
/* |
/* 呼叫lexer,然後結束程式*/ |
||
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 |
||
第75行: | 第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 |
||
第85行: | 第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]] |
||
第94行: | 第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}} |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
[[Category:Unix SUS2008 utilities]] |
|||
⚫ | |||
[[de:Lex (Informatik)]] |
|||
[[Category:分析器生成器]] |
|||
[[es:Lex (informática)]] |
|||
⚫ | |||
[[fa:لکس]] |
|||
⚫ | |||
[[fr:Lex et yacc]] |
|||
[[Category:程序設計工具]] |
|||
[[hu:Lex (informatika)]] |
|||
[[ja: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)