<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; 词法分析</title>
	<atom:link href="https://www.phppan.com/tag/%e8%af%8d%e6%b3%95%e5%88%86%e6%9e%90/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 25 Apr 2026 00:56:17 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>使用Bison和re2c构建词法分析和语法分析器</title>
		<link>https://www.phppan.com/2011/10/bison-and-re2c/</link>
		<comments>https://www.phppan.com/2011/10/bison-and-re2c/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 01:05:55 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[Bison]]></category>
		<category><![CDATA[Lex]]></category>
		<category><![CDATA[PHP源码]]></category>
		<category><![CDATA[yacc]]></category>
		<category><![CDATA[词法分析]]></category>
		<category><![CDATA[语法分析]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1486</guid>
		<description><![CDATA[使用说明： 本文需要读者对C语言有一定的基础，对于re2c和bison有一些了解，最好也熟悉linux命令 我 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em;">使用说明： 本文需要读者对C语言有一定的基础，对于re2c和bison有一些了解，最好也熟悉linux命令</p>
<p style="text-indent: 2em;">我们在前面介绍了<a style="color: #1299da; text-decoration: underline;" href="http://www.phppan.com/2011/10/php-yacc-bison/">PHP的语法分析器-Bison入门</a> 和<a style="color: #1299da; text-decoration: underline;" href="http://www.phppan.com/2011/09/php-lexical-re2c/">PHP的词法解析器：re2c</a>，那么如何将re2c与bison集成在一起的呢？ 我们以一个从PHP源码中剥离出来的示例来说明整个过程。这个示例的功能与词法分析器的示例类似，作用都是识别输入参数中的字符串类型。 本示例是在其基础上添加了语法解析过程。 首先我们看这个示例的语法文件：demo.y</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #e0882f;">%</span><span style="color: #ffffff;">{</span>
<span style="color: #bd48b3; font-style: italic;">#include &lt;stdio.h&gt;</span>
<span style="color: #bd48b3; font-style: italic;">#include "demo_scanner.h"</span>
<span style="color: #cc7833;">extern</span> <span style="color: #1299da;">int</span> yylex<span style="color: #ffffff;">(</span>znode <span style="color: #e0882f;">*</span>zendlval<span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
<span style="color: #1299da;">void</span> yyerror<span style="color: #ffffff;">(</span><span style="color: #1299da;">char</span> <span style="color: #1299da;">const</span> <span style="color: #e0882f;">*</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>

<span style="color: #bd48b3; font-style: italic;">#define YYSTYPE znode   //关键点一，znode定义在demo_scanner.h   </span>
<span style="color: #e0882f;">%</span><span style="color: #ffffff;">}</span>

<span style="color: #e0882f;">%</span>pure_parser    <span style="color: #bc9458; font-style: italic;">//  关键点二</span>

<span style="color: #e0882f;">%</span>token T_BEGIN
<span style="color: #e0882f;">%</span>token T_NUMBER
<span style="color: #e0882f;">%</span>token T_LOWER_CHAR
<span style="color: #e0882f;">%</span>token T_UPPER_CHAR
<span style="color: #e0882f;">%</span>token T_EXIT
<span style="color: #e0882f;">%</span>token T_UNKNOWN
<span style="color: #e0882f;">%</span>token T_INPUT_ERROR
<span style="color: #e0882f;">%</span>token T_END
<span style="color: #e0882f;">%</span>token T_WHITESPACE

<span style="color: #e0882f;">%%</span>

begin<span style="color: #e0882f;">:</span> T_BEGIN <span style="color: #ffffff;">{</span><a style="color: #1299da; text-decoration: none;" href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #e2392d;">printf</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"begin:<span>\n</span>token=%d<span>\n</span>"</span><span style="color: #e0882f;">,</span> $1.<span style="color: #ffffff;">op_type</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>
     <span style="color: #e0882f;">|</span> begin variable <span style="color: #ffffff;">{</span>
        <a style="color: #1299da; text-decoration: none;" href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #e2392d;">printf</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"token=%d "</span><span style="color: #e0882f;">,</span> $2.<span style="color: #ffffff;">op_type</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
        <span style="color: #ff8400;">if</span> <span style="color: #ffffff;">(</span>$2.<span style="color: #ffffff;">constant</span>.<span style="color: #ffffff;">value</span>.<span style="color: #ffffff;">str</span>.<span style="color: #ffffff;">len</span> <span style="color: #e0882f;">&gt;</span> <span style="color: #1299da;">0</span><span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>
            <a style="color: #1299da; text-decoration: none;" href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #e2392d;">printf</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"text=%s"</span><span style="color: #e0882f;">,</span> $2.<span style="color: #ffffff;">constant</span>.<span style="color: #ffffff;">value</span>.<span style="color: #ffffff;">str</span>.<span style="color: #ffffff;">val</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
        <span style="color: #ffffff;">}</span>
        <a style="color: #1299da; text-decoration: none;" href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #e2392d;">printf</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"<span>\n</span>"</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span>

variable<span style="color: #e0882f;">:</span> T_NUMBER <span style="color: #ffffff;">{</span>$$ <span style="color: #e0882f;">=</span> $<span style="color: #1299da;">1</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>
<span style="color: #e0882f;">|</span>T_LOWER_CHAR <span style="color: #ffffff;">{</span>$$ <span style="color: #e0882f;">=</span> $<span style="color: #1299da;">1</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>
<span style="color: #e0882f;">|</span>T_UPPER_CHAR <span style="color: #ffffff;">{</span>$$ <span style="color: #e0882f;">=</span> $<span style="color: #1299da;">1</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>
<span style="color: #e0882f;">|</span>T_EXIT <span style="color: #ffffff;">{</span>$$ <span style="color: #e0882f;">=</span> $<span style="color: #1299da;">1</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>
<span style="color: #e0882f;">|</span>T_UNKNOWN <span style="color: #ffffff;">{</span>$$ <span style="color: #e0882f;">=</span> $<span style="color: #1299da;">1</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>
<span style="color: #e0882f;">|</span>T_INPUT_ERROR <span style="color: #ffffff;">{</span>$$ <span style="color: #e0882f;">=</span> $<span style="color: #1299da;">1</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>
<span style="color: #e0882f;">|</span>T_END <span style="color: #ffffff;">{</span>$$ <span style="color: #e0882f;">=</span> $<span style="color: #1299da;">1</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>
<span style="color: #e0882f;">|</span>T_WHITESPACE <span style="color: #ffffff;">{</span>$$ <span style="color: #e0882f;">=</span> $<span style="color: #1299da;">1</span><span style="color: #e0882f;">;</span><span style="color: #ffffff;">}</span>

<span style="color: #e0882f;">%%</span>

<span style="color: #1299da;">void</span> yyerror<span style="color: #ffffff;">(</span><span style="color: #1299da;">char</span> <span style="color: #1299da;">const</span> <span style="color: #e0882f;">*</span>s<span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>
    <a style="color: #1299da; text-decoration: none;" href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #e2392d;">printf</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"%s<span>\n</span>"</span><span style="color: #e0882f;">,</span> s<span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span></pre>
<p style="text-indent: 2em;">这个语法文件有两个关键点：</p>
<p style="text-indent: 2em;">1、znode是复制PHP源码中的znode，只是这里我们只保留了两个字段，其结构如下：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #1299da;">typedef</span> <span style="color: #1299da;">union</span> _zvalue_value <span style="color: #ffffff;">{</span>
    <span style="color: #1299da;">long</span> lval<span style="color: #e0882f;">;</span>                  <span style="color: #bd48b3; font-style: italic;">/* long value */</span>
    <span style="color: #1299da;">double</span> dval<span style="color: #e0882f;">;</span>                <span style="color: #bd48b3; font-style: italic;">/* double value */</span>
    <span style="color: #1299da;">struct</span> <span style="color: #ffffff;">{</span>
        <span style="color: #1299da;">char</span> <span style="color: #e0882f;">*</span>val<span style="color: #e0882f;">;</span>
        <span style="color: #1299da;">int</span> len<span style="color: #e0882f;">;</span>
    <span style="color: #ffffff;">}</span> str<span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span> zvalue_value<span style="color: #e0882f;">;</span>

<span style="color: #1299da;">typedef</span> <span style="color: #1299da;">struct</span> _zval_struct <span style="color: #ffffff;">{</span>
    <span style="color: #bd48b3; font-style: italic;">/* Variable information */</span>
    zvalue_value value<span style="color: #e0882f;">;</span>     <span style="color: #bd48b3; font-style: italic;">/* value */</span>
    <span style="color: #1299da;">int</span> type<span style="color: #e0882f;">;</span>    <span style="color: #bd48b3; font-style: italic;">/* active type */</span>
<span style="color: #ffffff;">}</span>zval<span style="color: #e0882f;">;</span>

<span style="color: #1299da;">typedef</span> <span style="color: #1299da;">struct</span> _znode <span style="color: #ffffff;">{</span>
    <span style="color: #1299da;">int</span> op_type<span style="color: #e0882f;">;</span>
    zval constant<span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span>znode<span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">这里我们同样也复制了PHP的zval结构，但是我们也只取了关于整型，浮点型和字符串型的结构。 op_type用于记录操作的类型，constant记录分析过程获取的数据。 一般来说，在一个简单的程序中，对所有的语言结构的语义值使用同一个数据类型就足够用了。比如在前一小节的逆波兰记号计算器示例就只有double类型。 而且Bison默认是对于所有语义值使用int类型。如果要指明其它的类型，可以像我们示例一样将YYSTYPE定义成一个宏:</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #bd48b3; font-style: italic;">#define YYSTYPE znode</span></pre>
<p style="text-indent: 2em;">2、%pure_parser 在Bison中声明%pure_parse表明你要产生一个可重入(reentrant)的分析器。默认情况下Bison调用的词法分析函数名为yylex，并且其参数为void，如果定义了YYLEX_PARAM，则使用YYLEX_PARAM为参数， 这种情况我们可以在Bison生成的.c文件中发现其是使用#ifdef实现。</p>
<p style="text-indent: 2em;">如果声明了%pure_parser，通信变量yylval和yylloc则变为yyparse函数中的局部变量，变量yynerrs也变为在yyparse中的局部变量，而yyparse自己的调用方式并没有改变。比如在我们的示例中我们声明了可重入，并且使用zval类型的变更作为yylex函数的第一个参数，则在生成的.c文件中，我们可以看到yylval的类型变成</p>
<blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-left: 60px; padding-right: 20px; background-image: url(http://localhost/git/blog/web/images/note.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #dfdfdf; border-top-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-bottom-style: solid; border-top-color: #aaaaaa; border-bottom-color: #aaaaaa; border-left-width: 0px; border-left-style: initial; border-left-color: initial; border-right-width: 0px; border-right-style: initial; border-right-color: initial; background-position: 15px 8px; background-repeat: no-repeat no-repeat;">
<p style="text-indent: 0px;">一个可重入(reentrant)程序是在执行过程中不变更的程序；换句话说,它全部由纯(pure)(只读)代码构成。 当可异步执行的时候，可重入特性非常重要。例如，从一个句柄调用不可重入程序可能是不安全的。 在带有多线程控制的系统中，一个非可重入程序必须只能被互锁(interlocks)调用。</p>
</blockquote>
<p style="text-indent: 2em;">通过声明可重入函数和使用znode参数，我们可以记录分析过程中获取的值和词法分析过程产生的token。 在yyparse调用过程中会调用yylex函数，在本示例中的yylex函数是借助re2c生成的。 在demo_scanner.l文件中定义了词法的规则。大部分规则是借用了上一小节的示例， 在此基础上我们增加了新的yylex函数，并且将zendlval作为通信变量，把词法分析过程中的字符串和token传递回来。 而与此相关的增加的操作为：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">SCNG(yy_text) = YYCURSOR;   //  记录当前字符串所在位置
/*!re2c
  &lt;!*&gt; {yyleng = YYCURSOR - SCNG(yy_text);} //  记录字符串长度</pre>
<p style="text-indent: 2em;">main函数发生了一些改变：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">int main(int argc, char* argv[])
{
    BEGIN(INITIAL); //  全局初始化，需要放在scan调用之前
    scanner_globals.yy_cursor = argv[1];    //将输入的第一个参数作为要解析的字符串

    yyparse();
    return 0;
}</pre>
<p style="text-indent: 2em;">在新的main函数中，我们新增加了yyparse函数的调用，此函数在执行过程中会自动调用yylex函数。</p>
<p style="text-indent: 2em;">如果需要运行这个程序，则需要执行下面的命令：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">re2c -o demo_scanner.c -c -t demo_scanner_def.h demo_scanner.l
bison -d demo.y
gcc -o t demo.tab.c demo_scanner.c
chmod +x t
./t "&lt;?php tipi2011"</pre>
<p style="text-indent: 2em;">相关代码下载请移步<a style="color: #1299da; text-decoration: underline;" href="https://github.com/reeze/tipi/tree/master/book/sample/chapt07/07-02-02-bison-and-re2c-demo">TIPI项目</a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/10/bison-and-re2c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP的词法解析器：re2c</title>
		<link>https://www.phppan.com/2011/09/php-lexical-re2c/</link>
		<comments>https://www.phppan.com/2011/09/php-lexical-re2c/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 01:24:09 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP源码]]></category>
		<category><![CDATA[re2c]]></category>
		<category><![CDATA[词法分析]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1473</guid>
		<description><![CDATA[re2c是一个扫描器制作工具，可以创建非常快速灵活的扫描器。它可以产生高效代码，基于C语言，可以支持C/C++ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em;"><a style="color: #1299da; text-decoration: underline;" href="http://www.re2c.org/">re2c</a>是一个扫描器制作工具，可以创建非常快速灵活的扫描器。它可以产生高效代码，基于C语言，可以支持C/C++代码。 与其它类似的扫描器不同，它偏重于为正则表达式产生高效代码（和他的名字一样）。因此，这比传统的词法分析器有更广泛的应用范围。 你可以在<a style="color: #1299da; text-decoration: underline;" href="http://sourceforge.net/projects/re2c/">sourceforge.net</a>获取源码。</p>
<p style="text-indent: 2em;">PHP在最开始的词法解析器是使用的是flex，后来PHP的改为使用re2c。 在源码目录下的Zend/zend_language_scanner.l 文件是re2c的规则文件， 如果需要修改该规则文件需要安装re2c才能重新编译。</p>
<p style="text-indent: 2em;">re2c调用方式：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">re2c [-bdefFghisuvVw1] [-o output] [-c [-t header]] file</pre>
<p style="text-indent: 2em;">我们通过一个简单的例子来看下re2c。如下是一个简单的扫描器，它的作用是判断所给的字符串是数字/小写字母/大小字母。 当然，这里没有做一些输入错误判断等异常操作处理。示例如下：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #bd48b3; font-style: italic;">#include &lt;stdio.h&gt;</span>

<span style="color: #1299da;">char</span> <span style="color: #e0882f;">*</span>scan<span style="color: #ffffff;">(</span><span style="color: #1299da;">char</span> <span style="color: #e0882f;">*</span>p<span style="color: #ffffff;">)</span><span style="color: #ffffff;">{</span>
<span style="color: #bd48b3; font-style: italic;">#define YYCTYPE char</span>
<span style="color: #bd48b3; font-style: italic;">#define YYCURSOR p</span>
<span style="color: #bd48b3; font-style: italic;">#define YYLIMIT p</span>
<span style="color: #bd48b3; font-style: italic;">#define YYMARKER q</span>
<span style="color: #bd48b3; font-style: italic;">#define YYFILL(n)</span>
    <span style="color: #bd48b3; font-style: italic;">/*!re2c
      [0-9]+ {return "number";}
      [a-z]+ {return "lower";}
      [A-Z]+ {return "upper";}
      [^] {return "unkown";}
     */</span>
<span style="color: #ffffff;">}</span>

<span style="color: #1299da;">int</span> main<span style="color: #ffffff;">(</span><span style="color: #1299da;">int</span> argc<span style="color: #e0882f;">,</span> <span style="color: #1299da;">char</span><span style="color: #e0882f;">*</span> argv<span style="color: #ffffff;">[</span><span style="color: #ffffff;">]</span><span style="color: #ffffff;">)</span>
<span style="color: #ffffff;">{</span>
    <a style="color: #1299da; text-decoration: none;" href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #e2392d;">printf</span></a><span style="color: #ffffff;">(</span><span style="color: #99ff00;">"%s<span>\n</span>"</span><span style="color: #e0882f;">,</span> scan<span style="color: #ffffff;">(</span>argv<span style="color: #ffffff;">[</span><span style="color: #1299da;">1</span><span style="color: #ffffff;">]</span><span style="color: #ffffff;">)</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>

    <span style="color: #ff8400;">return</span> <span style="color: #1299da;">0</span><span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span></pre>
<p style="text-indent: 2em;">如果你是在ubuntu环境下，可以执行下面的命令生成可执行文件。</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">re2c -o a.c a.l
gcc a.c -o a
chmod +x a
./a 1000</pre>
<p style="text-indent: 2em;">此时程序会输出number。</p>
<p style="text-indent: 2em;">我们解释一下我们用到的几个re2c约定的宏。</p>
<ul>
<li>YYCTYPE 用于保存输入符号的类型，通常为char型和unsigned char型</li>
<li>YYCURSOR 指向当前输入标记， -当开始时，它指向当前标记的第一个字符，当结束时，它指向下一个标记的第一个字符</li>
<li>YYFILL(n) 当生成的代码需要重新加载缓存的标记时，则会调用YYFILL(n)。</li>
<li>YYLIMIT 缓存的最后一个字符，生成的代码会反复比较YYCURSOR和YYLIMIT，以确定是否需要重新填充缓冲区。</li>
</ul>
<p style="text-indent: 2em;">参照如上几个标识的说明，可以较清楚的理解生成的a.c文件，当然，re2c不会仅仅只有上面代码所显示的标记， 这只是一个简单示例，更多的标识说明和帮助信息请移步 <a style="color: #1299da; text-decoration: underline;" href="http://re2c.org/manual.html">re2c帮助文档</a>：<a style="color: #1299da; text-decoration: underline;" href="http://re2c.org/manual.html">http://re2c.org/manual.html</a>。</p>
<p style="text-indent: 2em;">更多编译器相关算法: <a style="color: #1299da; text-decoration: underline;" href="http://www.softpanorama.org/Algorithms/compilers.shtml">Compiler Algorithms</a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/09/php-lexical-re2c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
