<?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=Quex</id>
	<title>Quex - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Quex"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Quex&amp;action=history"/>
	<updated>2026-07-15T00:43:54Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Quex&amp;diff=825932&amp;oldid=prev</id>
		<title>imported&gt;InternetArchiveBot：​补救1个来源，并将0个来源标记为失效。) #IABot (v2.0.8</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Quex&amp;diff=825932&amp;oldid=prev"/>
		<updated>2021-02-08T16:20:57Z</updated>

		<summary type="html">&lt;p&gt;补救1个来源，并将0个来源标记为失效。) #IABot (v2.0.8&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox_Software |&lt;br /&gt;
  name = quex |&lt;br /&gt;
  logo = |&lt;br /&gt;
  developer = Dr.-Ing. Frank-Rene Schäfer |&lt;br /&gt;
  latest_release_version = 0.59.7 |&lt;br /&gt;
  latest_release_date = {{release date|2011|08|14}} |&lt;br /&gt;
  operating_system = [[Cross-platform]] |&lt;br /&gt;
  genre = [[Lexical analysis|Lexical analyzer]] generator |&lt;br /&gt;
  license = [[GNU Lesser General Public License|LGPL]]|&lt;br /&gt;
  website = [http://quex.sourceforge.net/ quex.sourceforge.net] |&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Quex&amp;#039;&amp;#039;&amp;#039; 是一个[[词法分析|词法分析器]]的产生器，它能创建[[C语言|C]]或者[[C++]]语言的词法分析器。Quex的一个显著特征是它能支持基于[[Unicode]]字符串的输入，而且创建的分析器代码是直接编码格式的（而非查表格式），具有较高的分词速度。另外，Quex在描述词法分析的语法上采用了类似于C++的继承语法和分模块语法，这使得语法的复用非常简单，语法结构更为清晰。&lt;br /&gt;
&lt;br /&gt;
==特性==&lt;br /&gt;
&lt;br /&gt;
===直接编码词法分析器===&lt;br /&gt;
&lt;br /&gt;
Quex使用传统的汤普森创造法，从从[[正则表达式]]首先创建[[不确定性有限状态机]],然后通过压缩和归并转换为[[确定性有限状态机]]，通过Hopcroft优化算法，使得确定性有限状态机的状态个数达到最小。通过这些机制，使得构建词法分析器的计算时间可以大大减少。相比其他词法分析器生成器只能处理[ASCII]字符串的情况，Quex还可以支持Unicode字符集，并可以产生合理的运算时间的词法分析器。&lt;br /&gt;
相比基于查表结构的词法分析器，Quex产生的直接编码方式的代码具有更高的运算速度，而且直接编码方式的代码更接近于人类手工书写的词法分析器代码，因此比查表结构的代码具有良好的可读性。&lt;br /&gt;
&lt;br /&gt;
=== 支持Unicode字符输入===&lt;br /&gt;
&lt;br /&gt;
Quex可以处理包含完整的Unicode代码点范围（0至10FFFFh）的字符输入，同时Quex的词法语法提供了支持Unicode的正则表达式格式。例如，与二进制属性XID_Start的Unicode代码点可以用表达式指定的&amp;lt;code&amp;gt;\P{XID_Start}&amp;lt;/code&amp;gt;或&amp;lt;code&amp;gt;\P{XIDS}&amp;lt;/code&amp;gt;来描述。Quex还可以生成代码来调用[[iconv]]库或[[International Components for Unicode|ICU]]的字符格式转换程序。Quex遵循[[Unicode Consortium]]提出的Unicode标准，若Unicode标准更新，则只需要将新版本的标准文件复制到到Quex相应的目录即可完成Quex对Unicode的支持更新。&lt;br /&gt;
&lt;br /&gt;
===词法分析模式===&lt;br /&gt;
&lt;br /&gt;
和传统的词法分析器（如[[LEX（软件）|LEX]]和[[Flex的词法分析器|Flex]]），Quex支持词法分析器中存在多个词法分析子模块（子模式）。除了传统的正则表达式的模式匹配外，Quex还可以指定事件动作：例如代码执行期间进入或退出一个模块或发现任何模式匹配时。Quex这种模块设计可以通过继承方式，让派生和继承模块很容易共享基类模块的匹配模式和事件操作。&lt;br /&gt;
&lt;br /&gt;
===先进的缓冲处理===&lt;br /&gt;
&lt;br /&gt;
Quex提供了先进的数据缓冲和重新装载，保证了运行时的高效和灵活。Quex以插件的方式提供字符转换的用户接口，允许用户使用自定义的字符集转换程序。当需要新的缓冲区填充的时候，转换程序被激活。默认情况下Quex使用的是[[iconv]]字符转换库，能够提供多种字符编码集之间的转换。&lt;br /&gt;
&lt;br /&gt;
==范例==&lt;br /&gt;
 can be translated into Quex source code as follows:&lt;br /&gt;
Quex使用的字符串匹配语法和经典lex和FLEX的词法生成器工具采用的正则表达式语法类似。[[Flex lexical analyser|Flex]]中的例子程序可以很容易的转换为Quex的语法。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
header {&lt;br /&gt;
   #include &amp;lt;cstdlib&amp;gt;  // C++ version of &amp;#039;stdlib.h&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
define {&lt;br /&gt;
   digit     [0-9]&lt;br /&gt;
   letter    [a-zA-Z]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mode X :&lt;br /&gt;
&amp;lt;skip:     [ \t\n\r]&amp;gt; &lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;+&amp;quot;                  =&amp;gt; QUEX_TKN_PLUS;       &lt;br /&gt;
    &amp;quot;-&amp;quot;                  =&amp;gt; QUEX_TKN_MINUS;      &lt;br /&gt;
    &amp;quot;*&amp;quot;                  =&amp;gt; QUEX_TKN_TIMES;      &lt;br /&gt;
    &amp;quot;/&amp;quot;                  =&amp;gt; QUEX_TKN_SLASH;      &lt;br /&gt;
    &amp;quot;(&amp;quot;                  =&amp;gt; QUEX_TKN_LPAREN;     &lt;br /&gt;
    &amp;quot;)&amp;quot;                  =&amp;gt; QUEX_TKN_RPAREN;     &lt;br /&gt;
    &amp;quot;;&amp;quot;                  =&amp;gt; QUEX_TKN_SEMICOLON;  &lt;br /&gt;
    &amp;quot;,&amp;quot;                  =&amp;gt; QUEX_TKN_COMMA;      &lt;br /&gt;
    &amp;quot;.&amp;quot;                  =&amp;gt; QUEX_TKN_PERIOD;     &lt;br /&gt;
    &amp;quot;:=&amp;quot;                 =&amp;gt; QUEX_TKN_BECOMES;    &lt;br /&gt;
    &amp;quot;=&amp;quot;                  =&amp;gt; QUEX_TKN_EQL;        &lt;br /&gt;
    &amp;quot;&amp;lt;&amp;gt;&amp;quot;                 =&amp;gt; QUEX_TKN_NEQ;        &lt;br /&gt;
    &amp;quot;&amp;lt;&amp;quot;                  =&amp;gt; QUEX_TKN_LSS;        &lt;br /&gt;
    &amp;quot;&amp;gt;&amp;quot;                  =&amp;gt; QUEX_TKN_GTR;        &lt;br /&gt;
    &amp;quot;&amp;lt;=&amp;quot;                 =&amp;gt; QUEX_TKN_LEQ;        &lt;br /&gt;
    &amp;quot;&amp;gt;=&amp;quot;                 =&amp;gt; QUEX_TKN_GEQ;        &lt;br /&gt;
    &amp;quot;begin&amp;quot;              =&amp;gt; QUEX_TKN_BEGINSYM;   &lt;br /&gt;
    &amp;quot;call&amp;quot;               =&amp;gt; QUEX_TKN_CALLSYM;    &lt;br /&gt;
    &amp;quot;const&amp;quot;              =&amp;gt; QUEX_TKN_CONSTSYM;   &lt;br /&gt;
    &amp;quot;do&amp;quot;                 =&amp;gt; QUEX_TKN_DOSYM;      &lt;br /&gt;
    &amp;quot;end&amp;quot;                =&amp;gt; QUEX_TKN_ENDSYM;     &lt;br /&gt;
    &amp;quot;if&amp;quot;                 =&amp;gt; QUEX_TKN_IFSYM;      &lt;br /&gt;
    &amp;quot;odd&amp;quot;                =&amp;gt; QUEX_TKN_ODDSYM;     &lt;br /&gt;
    &amp;quot;procedure&amp;quot;          =&amp;gt; QUEX_TKN_PROCSYM;    &lt;br /&gt;
    &amp;quot;then&amp;quot;               =&amp;gt; QUEX_TKN_THENSYM;    &lt;br /&gt;
    &amp;quot;var&amp;quot;                =&amp;gt; QUEX_TKN_VARSYM;     &lt;br /&gt;
    &amp;quot;while&amp;quot;              =&amp;gt; QUEX_TKN_WHILESYM;   &lt;br /&gt;
&lt;br /&gt;
    {letter}({letter}|{digit})* =&amp;gt; QUEX_TKN_IDENT(strdup(Lexeme));&lt;br /&gt;
    {digit}+                    =&amp;gt; QUEX_TKN_NUMBER(atoi(Lexeme));&lt;br /&gt;
    .                           =&amp;gt; QUEX_TKN_UNKNOWN(Lexeme);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
通过使用符号“=&amp;gt;”操作符，可以将特定的匹配字符串和对应的词法的Token的ID进行关联。尖括号中的语法表示词法分析器将跳过由空格和tab等组成的字符，圆括号内表示字符串匹配后，可调用C函数进行相应的处理。&lt;br /&gt;
&lt;br /&gt;
对于更复杂的处理，可使用花括号包含所需要的处理语句，如下所示：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    {digit}+       {&lt;br /&gt;
           if( is_prime_number(Lexeme) )     ++prime_number_counter;&lt;br /&gt;
           if( is_fibonacci_number(Lexeme) ) ++fibonacci_number_counter;  &lt;br /&gt;
           self.send(QUEX_TKN_NUMBER(atoi(Lexeme)));&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
以上的代码，可以被用来统计处理字符串中的数值的个数。&lt;br /&gt;
&lt;br /&gt;
== 另外可查阅 ==&lt;br /&gt;
* [[Lexical analysis]]&lt;br /&gt;
* 关于托马斯构建法和Hopcroft优化方法，可查阅书籍例如 &amp;#039;&amp;#039;[[Compilers: Principles, Techniques, and Tools]]&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
==外部链接==&lt;br /&gt;
* [http://quex.sourceforge.net/ Quex]{{Wayback|url=http://quex.sourceforge.net/ |date=20110718121712 }}, 官方网页&lt;br /&gt;
* {{SourceForge|quex|Lexical Analyzer Generator Quex sourceforge 主页}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Free compilers and interpreters]]&lt;br /&gt;
[[Category:Parser generators]]&lt;/div&gt;</summary>
		<author><name>imported&gt;InternetArchiveBot</name></author>
	</entry>
</feed>