<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Lex</id>
	<title>Lex - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Lex"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Lex&amp;action=history"/>
	<updated>2026-07-07T04:36:54Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Lex&amp;diff=644080&amp;oldid=prev</id>
		<title>imported&gt;Clod Huang：​/* lex */</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Lex&amp;diff=644080&amp;oldid=prev"/>
		<updated>2021-02-17T01:31:30Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;lex&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{noteTA|G1=IT}}&lt;br /&gt;
{{not|蕾丝|LexBurner}}&lt;br /&gt;
{{Infobox Software &lt;br /&gt;
| name                   = Lex&lt;br /&gt;
| logo                   = &lt;br /&gt;
| screenshot             = &lt;br /&gt;
| screenshot size        = &lt;br /&gt;
| caption                = &lt;br /&gt;
| author                 = [[Mike Lesk]], [[Eric Schmidt]]&lt;br /&gt;
| developer              = &lt;br /&gt;
| released               = {{Start date and age|1975}}&lt;br /&gt;
| latest release version = &lt;br /&gt;
| latest release date    = &lt;br /&gt;
| operating system       = [[Unix]]和[[类Unix系统]]&lt;br /&gt;
| genre                  = [[命令 (计算机)|命令]]&lt;br /&gt;
| license                = &lt;br /&gt;
| website                = &lt;br /&gt;
}}&lt;br /&gt;
在[[電腦科學]]裡面，&amp;#039;&amp;#039;&amp;#039;lex&amp;#039;&amp;#039;&amp;#039;是一個產生[[詞法分析]]器（lexical analyzer，&amp;quot;掃描器&amp;quot;（scanners）或者&amp;quot;lexers&amp;quot;）的[[電腦程式|程式]]。&amp;lt;ref&amp;gt;{{cite book|last1=Levine|first1=John R|first2=Tony|last2=Mason|first3=Doug|last3=Brown|title=LEX &amp;amp; YACC|pages=1–2|publisher=[[O&amp;#039;Reilly Media|O&amp;#039;Reilly]]|year=1992|edition=2|isbn=1-56592-000-7|url=http://books.google.co.in/books?id=YrzpxNYegEkC&amp;amp;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&amp;amp;printsec=frontcover#PPA1,M1|dead-url=no}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite book&lt;br /&gt;
  | last = Levine&lt;br /&gt;
  | first = John&lt;br /&gt;
  | authorlink = John Levine&lt;br /&gt;
  | coauthors = &lt;br /&gt;
  | title = flex &amp;amp; bison&lt;br /&gt;
  | publisher = O&amp;#039;Reilly Media&lt;br /&gt;
  | date = August 2009&lt;br /&gt;
  | location = &lt;br /&gt;
  | pages = 304&lt;br /&gt;
  | url = http://oreilly.com/catalog/9780596155988&lt;br /&gt;
  | doi = &lt;br /&gt;
  | id = &lt;br /&gt;
  | isbn = 978-0-596-15597-1&lt;br /&gt;
  | access-date = 2010-03-16&lt;br /&gt;
  | archive-date = 2011-08-16&lt;br /&gt;
  | archive-url = https://web.archive.org/web/20110816025643/http://oreilly.com/catalog/9780596155988&lt;br /&gt;
  | dead-url = no&lt;br /&gt;
  }}&amp;lt;/ref&amp;gt; Lex常常與[[yacc]] [[語法分析器產生程式]]（parser generator）一起使用。Lex(最早是[[埃里克·施密特]]和[[迈克·莱斯克]]製作）是許多[[UNIX]]系統的標準[[詞法分析器]]（lexical analyzer）產生程式，而且這個工具所作的行為被詳列為[[POSIX]]標準的一部分。&lt;br /&gt;
&lt;br /&gt;
Lex讀進一個代表詞法分析器規則的輸入[[字串流]]，然後輸出以[[C語言]]實做的詞法分析器[[原始碼]]。&lt;br /&gt;
&lt;br /&gt;
雖然傳統上是商業軟體，但是有些根據原本AT&amp;amp;T程式碼這些版本的Lex可以以[[公開原始碼]]的形式獲得，並被視為某些系統的一部份，例如說[[OpenSolaris]]和[[貝爾實驗室九號計畫]]。另一個有名的Lex[[公開原始碼]]版本是[[flex詞法分析器|flex]]，代表&amp;quot;快速的詞法分析器&amp;quot;（fast lexical analyzer）&lt;br /&gt;
&lt;br /&gt;
==lex檔案的結構==&lt;br /&gt;
lex的檔案結構故意設計的與yacc的檔案格式相似；檔案分成三個區塊，均以一個只有兩個百分比符號（%）的單行來分隔，如下：&lt;br /&gt;
 &amp;#039;&amp;#039;定義區塊&amp;#039;&amp;#039;&lt;br /&gt;
 %%&lt;br /&gt;
 &amp;#039;&amp;#039;規則區塊&amp;#039;&amp;#039;&lt;br /&gt;
 %%&lt;br /&gt;
 &amp;#039;&amp;#039;C程式碼區塊&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;定義&amp;#039;&amp;#039;&amp;#039;區塊是用來定義[[巨集]]以及匯入[[C語言|C]]寫成的[[表頭檔]]所在區塊。在這裡面也可以寫一些C程式碼，這一些程式碼會被複製到產生出來的C原始碼的開頭部份。&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;規則&amp;#039;&amp;#039;&amp;#039;區塊是最重要的區塊；這裡將樣式與C的[[陳述 (程式)|陳述]]（statement）串連在一起。這一些樣式都是[[正規表式]]。當lexer看到輸入裡面有合乎給定的樣式時，則會操作相對應的C程式碼。這就是lex運作的基礎。&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;C程式碼&amp;#039;&amp;#039;&amp;#039;區塊包含C的陳述與[[子程式|函式]]（function）會原封不動的照搬到產生出來的C原始碼裡面。這些陳述一般假設包含了在規則區塊裡面，各個規則分別呼叫的原始碼。在大型程式裡面，將這一些程式放在其他分開的檔案並且在[[編譯器|編譯]]階段作連接會更方便（在進行修改跟擴充的時候）。&lt;br /&gt;
&lt;br /&gt;
==lex文件示例==&lt;br /&gt;
下面是一个[[flex]]版本的lex文件的示例。这个程序可以找出表示数字（整数）的字符串，并将它们打印出来。&lt;br /&gt;
&amp;lt;!--這裡面程式碼的註解我也順便翻譯成為中文，方便大家閱讀--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;/*** 定義區塊***/&lt;br /&gt;
&lt;br /&gt;
%{&lt;br /&gt;
/* 會直接照搬放檔頭的C code */&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
/* 這裡告訴flex只要讀取輸入的檔案（不需要其他檔案）*/&lt;br /&gt;
%option noyywrap&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
    /*** 規則區塊***/&lt;br /&gt;
&lt;br /&gt;
    /* [0-9]+代表包含一個或多個數字的字串*/&lt;br /&gt;
[0-9]+  {&lt;br /&gt;
            /* yytext是一個字串變數，內容是符合規則的字串本身。*/&lt;br /&gt;
            printf(&amp;quot;Saw an integer: %s\n&amp;quot;, yytext);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
.       {   /* 忽略所有其他的字*/   }&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
/*** C程式碼區塊***/&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    /* 呼叫lexer，然後結束程式*/&lt;br /&gt;
    yylex();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
將這個檔案輸入給flex，它會將這個檔案轉換成一個C檔案，檔名lex.yy.c。這個C檔案可以被編譯成一份可執行檔，功能為找出並且輸出代表整數的字串。例如，給定輸入：&lt;br /&gt;
 abc123z.!&amp;amp;*2ghj6&lt;br /&gt;
這隻程式會印出：&lt;br /&gt;
 Saw an integer: 123&lt;br /&gt;
 Saw an integer: 2&lt;br /&gt;
 Saw an integer: 6&lt;br /&gt;
&lt;br /&gt;
==Lex和其他工具並用==&lt;br /&gt;
===Lex和語法分析產生程式（parser generator）並用===&lt;br /&gt;
Lex和語法分析器產生程式，例如說[[Yacc]]或者[[GNU bison|Bison]]之類，常常一起使用。語法分析器產生程式使用[[形式文法]]來分析輸入字串流（input stream），這是Lex使用簡單的[[正規表示式]]所作不到的事情（Lex的設計被限制於只能使用[[有限狀態自動機]]）。然而，語法分析器產生程式不能直接讀取簡單的輸入字串流–他們需要使用一系列的單詞（token）。Lex則常常被使用來提供語法分析器產生程式這一些單詞。&lt;br /&gt;
&lt;br /&gt;
===Lex和make===&lt;br /&gt;
[[make]]是一個便利程式（utility），在這裡我們用它來維護跟lex相關的程式。make假設副檔名是&amp;lt;code&amp;gt;.l&amp;lt;/code&amp;gt;的檔案是一個lex原始碼檔案。make內部的巨集&amp;lt;code&amp;gt;LFLAGS&amp;lt;/code&amp;gt;可以用來詳列make自動觸發的lex選項。&amp;lt;ref&amp;gt;{{citation&lt;br /&gt;
   |url=http://www.opengroup.org/onlinepubs/009695399/utilities/make.html&lt;br /&gt;
   |title=make&lt;br /&gt;
   |journal=The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition&lt;br /&gt;
   |publisher=The IEEE and The Open Group&lt;br /&gt;
   |date=2004&lt;br /&gt;
   |accessdate=2010-03-16&lt;br /&gt;
   |archive-date=2010-10-31&lt;br /&gt;
   |archive-url=https://web.archive.org/web/20101031131616/http://www.opengroup.org/onlinepubs/009695399/utilities/make.html&lt;br /&gt;
   |dead-url=no&lt;br /&gt;
   }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==相關條目==&lt;br /&gt;
*[[flex詞法分析器]]&lt;br /&gt;
*[[Yacc]]&lt;br /&gt;
*[[Ragel]]&lt;br /&gt;
*[[Quex]]&lt;br /&gt;
*[[List of C Sharp lexer generators|List of C# lexer generators]]&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;br /&gt;
{{Reflist|30em}}&lt;br /&gt;
&lt;br /&gt;
==外部連結==&lt;br /&gt;
*[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 }}&lt;br /&gt;
&lt;br /&gt;
[[Category:编译工具]]&lt;br /&gt;
[[Category:分析器生成器]]&lt;br /&gt;
[[Category:Unix编程工具]]&lt;br /&gt;
[[Category:Unix SUS2008实用工具]]&lt;br /&gt;
[[Category:程序設計工具]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Clod Huang</name></author>
	</entry>
</feed>