﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ngaut-随笔分类-Compilers:Principles,Techniques,and Tools </title><link>http://www.cppblog.com/ngaut/category/1618.html</link><description>asm/c/c++/......</description><language>zh-cn</language><lastBuildDate>Sat, 27 Dec 2008 09:17:14 GMT</lastBuildDate><pubDate>Sat, 27 Dec 2008 09:17:14 GMT</pubDate><ttl>60</ttl><item><title>我也发一个超级简单的玩具级编译器，仅此说明一下编译的几个过程【开源】</title><link>http://www.cppblog.com/ngaut/archive/2008/08/10/58451.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 10 Aug 2008 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/08/10/58451.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/58451.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/08/10/58451.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/58451.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/58451.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2008/08/10/58451.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/58451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-08-10 16:56 <a href="http://www.cppblog.com/ngaut/archive/2008/08/10/58451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍一款国产开源C编译器</title><link>http://www.cppblog.com/ngaut/archive/2008/08/08/58346.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 08 Aug 2008 09:23:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/08/08/58346.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/58346.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/08/08/58346.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/58346.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/58346.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2008/08/08/58346.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/58346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-08-08 17:23 <a href="http://www.cppblog.com/ngaut/archive/2008/08/08/58346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近写了个小工具，自动往代码里面加入垃圾代码</title><link>http://www.cppblog.com/ngaut/archive/2008/07/29/57385.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 28 Jul 2008 17:32:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/07/29/57385.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/57385.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/07/29/57385.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/57385.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/57385.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2008/07/29/57385.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/57385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-07-29 01:32 <a href="http://www.cppblog.com/ngaut/archive/2008/07/29/57385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>antlr笔记</title><link>http://www.cppblog.com/ngaut/archive/2008/06/15/53341.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 15 Jun 2008 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/06/15/53341.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/53341.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/06/15/53341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/53341.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/53341.html</trackback:ping><description><![CDATA[请勿将任何相关的文件放在中文目录下，如语法文件 *.g<br> <img src ="http://www.cppblog.com/ngaut/aggbug/53341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-06-15 15:32 <a href="http://www.cppblog.com/ngaut/archive/2008/06/15/53341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>antlr资料</title><link>http://www.cppblog.com/ngaut/archive/2008/05/30/51619.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 30 May 2008 10:28:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/05/30/51619.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/51619.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/05/30/51619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/51619.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/51619.html</trackback:ping><description><![CDATA[
<a href="http://www.antlr.org/wiki/display/ANTLR3/Interfacing+AST+with+Java">http://www.antlr.org/wiki/display/ANTLR3/Interfacing+AST+with+Java</a><br><a href="http://www.cnblogs.com/RicCC/archive/2008/03/17/antlr-notepad.html">http://www.cnblogs.com/RicCC/archive/2008/03/17/antlr-notepad.html</a> <br><a href="http://llf.javaeye.com/blog/157507">http://llf.javaeye.com/blog/157507</a> <br><a href="http://llf.javaeye.com/blog/156170">http://llf.javaeye.com/blog/156170</a><div><span  style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; ">http://www.bearcave.com/software/antlr/antlr_examples.html</span><br></div><img src ="http://www.cppblog.com/ngaut/aggbug/51619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-05-30 18:28 <a href="http://www.cppblog.com/ngaut/archive/2008/05/30/51619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EBNF Grammar for Mini-Java</title><link>http://www.cppblog.com/ngaut/archive/2008/04/28/48376.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 28 Apr 2008 12:25:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/04/28/48376.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/48376.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/04/28/48376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/48376.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/48376.html</trackback:ping><description><![CDATA[<h1>EBNF Grammar for Mini-Java</h1>
<p><!-- width = 117 15 6??  -->
<table>
    <!-- Goal -->
    <tbody>
        <tr>
            <td vAlign=baseline align=right><a name=prod1>Goal</a></td>
            <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>=</font></em></span></td>
            <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#MainClass"><font color=#000000>MainClass</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>{</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#prod3"><font color=#000000>ClassDeclaration</font></a> <span class=meta><em><font color=#ff0000 size=4>},</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#EOF"><font color=#000000>EOF</font></a><span class=meta><em><font color=#ff0000 size=4>;</font></em></span> </td>
        </tr>
        <tr style="HEIGHT: 15px">
            <td></td>
        </tr>
        <!-- for inter-row spacing -->
    </tbody>
    <!-- MainClass -->
    <tbody>
        <tr>
            <td vAlign=baseline align=right><a name=MainClass>MainClass</a></td>
            <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>=</font></em></span></td>
            <!-- class Identifier { public static void main ( String [ ] Identifier ) { Statement } } -->
            <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"class"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"{"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"public"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"static"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"void"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"main"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"("</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"String"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"["</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"]"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">")"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"{"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Statement"><font color=#000000>Statement</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"}"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"}"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>;</font></em></span> </td>
        </tr>
        <tr style="HEIGHT: 15px">
            <td></td>
        </tr>
        <!-- for inter-row spacing -->
    </tbody>
    <!-- ClassDeclaration -->
    <tbody>
        <tr>
            <td vAlign=baseline align=right><a name=ClassDeclaration>ClassDeclaration</a></td>
            <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>=</font></em></span></td>
            <!-- class Identifier (/ extends Identifer /) { (: VarDeclaration :) (: MethodDeclaration :) }  -->
            <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"class"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>[</font></em></span> <span class=key><strong><font face="Courier New">"extends"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a> <em><font size=4><font color=#ff0000><span class=meta>]</span><span class=meta>,</span></font></font></em> <span class=key><strong><font face="Courier New">"{"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>{</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#VarDeclaration"><font color=#000000>VarDeclaration</font></a> <em><font size=4><font color=#ff0000><span class=meta>}</span><span class=meta>,</span></font></font></em> <span class=meta><em><font color=#ff0000 size=4>{</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#MethodDeclartion"><font color=#000000>MethodDeclaration</font></a> <span class=meta><em><font color=#ff0000 size=4>}</font></em></span> <span class=key><strong><font face="Courier New">"}"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>;</font></em></span> </td>
        </tr>
        <tr style="HEIGHT: 15px">
            <td></td>
        </tr>
        <!-- for inter-row spacing -->
    </tbody>
    <!-- VarDeclaration -->
    <tbody>
        <tr>
            <td vAlign=baseline align=right><a name=VarDeclaration>VarDeclaration</a></td>
            <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>=</font></em></span></td>
            <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Type"><font color=#000000>Type</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">";"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>;</font></em></span> </td>
            <tr style="HEIGHT: 15px">
                <td></td>
            </tr>
            <!-- inter-row spacing -->
        </tbody>
        <!-- MethodDeclaration -->
        <tbody>
            <tr>
                <td vAlign=baseline align=right><a name=MethodDeclaration>MethodDeclaration</a></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>=</font></em></span></td>
                <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"public"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Type"><font color=#000000>Type</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"("</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>[</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Type"><font color=#000000>Type</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>{</font></em></span> <span class=key><strong><font face="Courier New">","</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Type"><font color=#000000>Type</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a> <span class=meta><em><font color=#ff0000 size=4>},</font></em></span> <em><font size=4><font color=#ff0000><span class=meta>]</span><span class=meta>,</span></font></font></em> <span class=key><strong><font face="Courier New">")"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"{"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>{</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#VarDeclaration"><font color=#000000>VarDeclaration</font></a> <em><font size=4><font color=#ff0000><span class=meta>}</span><span class=meta>,</span></font></font></em> <span class=meta><em><font color=#ff0000 size=4>{</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Statement"><font color=#000000>Statement</font></a> <em><font size=4><font color=#ff0000><span class=meta>}</span><span class=meta>,</span></font></font></em> <span class=key><strong><font face="Courier New">"return"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">";"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"}"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>;</font></em></span> </td>
            </tr>
            <tr style="HEIGHT: 15px">
                <td></td>
            </tr>
            <!-- inter-row spacing -->
        </tbody>
        <!-- Type -->
        <tbody>
            <tr>
                <td vAlign=baseline align=right><a name=Type>Type</a></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>=</font></em></span></td>
                <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"int"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"["</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"]"</font></strong></span> </td>
            </tr>
            <tr>
                <td vAlign=baseline align=right></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"boolean"</font></strong></span></td>
            </tr>
            <tr>
                <td vAlign=baseline align=right><strong><font face="Courier New"></font></strong></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"int"</font></strong></span></td>
            </tr>
            <tr>
                <td vAlign=baseline align=right><strong><font face="Courier New"></font></strong></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a></td>
            </tr>
            <tr>
                <td vAlign=baseline align=right></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>;</font></em></span></td>
                <td vAlign=baseline align=left><em><font color=#ff0000 size=4></font></em></td>
            </tr>
            <tr style="HEIGHT: 15px">
                <td><em><font color=#ff0000 size=4></font></em></td>
            </tr>
            <!-- inter-row spacing -->
        </tbody>
        <!-- Statement -->
        <tbody>
            <tr>
                <td vAlign=baseline align=right><a name=Statement>Statement</a></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>=</font></em></span></td>
                <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"{"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>{</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Statement"><font color=#000000>Statement</font></a> <em><font size=4><font color=#ff0000><span class=meta>}</span><span class=meta>,</span></font></font></em> <span class=key><strong><font face="Courier New">"}" </font></strong></span></td>
            </tr>
            <tr>
                <td vAlign=baseline align=right><strong><font face="Courier New"></font></strong></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"if"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"("</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">")"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Statement"><font color=#000000>Statement</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"else"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Statement"><font color=#000000>Statement</font></a> </td>
            </tr>
            <tr>
                <td vAlign=baseline align=right></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"while"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"("</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">")"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Statement"><font color=#000000>Statement</font></a> </td>
            </tr>
            <tr>
                <td vAlign=baseline align=right></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"System.out.println"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"("</font></strong></span> <span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">")"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">";"</font></strong></span> </td>
            </tr>
            <tr>
                <td vAlign=baseline align=right></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"="</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">";"</font></strong></span> </td>
            </tr>
            <tr>
                <td vAlign=baseline align=right></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"["</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"]"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"="</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">";"</font></strong></span> </td>
            </tr>
            <tr>
                <td vAlign=baseline align=right></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>;</font></em></span></td>
                <td vAlign=baseline align=left><em><font color=#ff0000 size=4></font></em></td>
            </tr>
            <tr style="HEIGHT: 15px">
                <td><em><font color=#ff0000 size=4></font></em></td>
            </tr>
            <!-- inter-row spacing -->
        </tbody>
        <!-- Expression -->
        <tbody>
            <!-- Expression ::= Expression ( "&&" | "<" | "+" | "-" | "*" ) Expression -->
            <tr>
                <td vAlign=baseline align=right><a name=Expression>Expression</a></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>=</font></em></span></td>
                <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a> <span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>(</font></em></span> "&amp;&amp;" | "&lt;" | "+" | "-" | "*" <span class=meta><em><font color=#ff0000 size=4>)</font></em></span> <span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a> </td>
            </tr>
            <!-- Expression ::= Expression  "[" Expression "]" -->
            <tr>
                <td vAlign=baseline align=right></td>
                <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"["</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"]"</font></strong></span> </td>
                <!-- Expression ::= Expression "." "length" -->
                <tr>
                    <td vAlign=baseline align=right></td>
                    <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                    <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"."</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"length"</font></strong></span> </td>
                    <tr>
                        <td vAlign=baseline align=right></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                        <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"."</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"("</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=meta><em><font color=#ff0000 size=4>[</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a> <span class=meta><em><font color=#ff0000 size=4>{</font></em></span> <span class=key><strong><font face="Courier New">","</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a> <span class=meta><em><font color=#ff0000 size=4>}</font></em></span> <em><font size=4><font color=#ff0000><span class=meta>]</span><span class=meta>,</span></font></font></em> <span class=key><strong><font face="Courier New">")"</font></strong></span> </td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                        <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#IntegerLiteral"><font color=#000000>IntegerLiteral</font></a> </td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span> </td>
                        <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"true"</font></strong></span></td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right><strong><font face="Courier New"></font></strong></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span> </td>
                        <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"false"</font></strong></span></td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right><strong><font face="Courier New"></font></strong></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                        <td vAlign=baseline align=left><a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a></td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                        <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"this"</font></strong></span></td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right><strong><font face="Courier New"></font></strong></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                        <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"new"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"int"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"["</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">"]"</font></strong></span> </td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                        <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"new"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Identifier"><font color=#000000>Identifier</font></a> <span class=meta><em><font color=#ff0000 size=4>,</font></em></span>"(" <span class=meta><em><font color=#ff0000 size=4>,</font></em></span>")"</td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                        <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"!"</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a> </td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>|</font></em></span></td>
                        <td vAlign=baseline align=left><span class=key><strong><font face="Courier New">"("</font></strong></span><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <a href="http://cs.fit.edu/~ryan/cse4251/mini_java_grammar.html#Expression"><font color=#000000>Expression</font></a><span class=meta><em><font color=#ff0000 size=4>,</font></em></span> <span class=key><strong><font face="Courier New">")"</font></strong></span> </td>
                    </tr>
                    <tr>
                        <td vAlign=baseline align=right></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>;</font></em></span></td>
                        <td vAlign=baseline align=left><em><font color=#ff0000 size=4></font></em></td>
                    </tr>
                    <tr style="HEIGHT: 15px">
                        <td><em><font color=#ff0000 size=4></font></em></td>
                    </tr>
                    <!-- inter-row spacing -->
                </tbody>
                <!-- Identifier -->
                <tbody>
                    <tr>
                        <td vAlign=baseline align=right><a name=Identifier>Identifier</a></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>is</font></em></span></td>
                        <td vAlign=baseline align=left>one or more letters, digits, and underscores, starting with a letter </td>
                    </tr>
                </tbody>
                <!-- IntegerLiteral -->
                <tbody>
                    <tr>
                        <td vAlign=baseline align=right><a name=IntegerLiteral>IntegerLiteral</a></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>is</font></em></span></td>
                        <td vAlign=baseline align=left>one or more decimal digits </td>
                    </tr>
                </tbody>
                <!-- EOF -->
                <tbody>
                    <tr>
                        <td vAlign=baseline align=right><a name=EOF>EOF</a></td>
                        <td vAlign=baseline align=middle><span class=meta><em><font color=#ff0000 size=4>is</font></em></span></td>
                        <td vAlign=baseline align=left>a distinguished token returned by the scanner at end-of-file </td>
                    </tr>
                </tbody>
            </table>
            <h2>Comments</h2>
            Comments are <tt>//</tt> to end of line and <tt>/* ... */</tt>, just as in Java. The <tt>/* ... */</tt> comments do <em>not</em> nest in Java. For example,
            <pre>/*
            One commment
            /*  Nested comment */
            Bad things will happen
            */
            </pre>
            The second <tt>/*</tt> will be ignored (it is in a comment), and the first <tt>*/</tt> will terminate the comment. Now, "bad things will happen" as the remaining text is not a comment.
            <p>Appel, 2nd edition, page 484, describes comments in MiniJava as being nestable. This is an interesting exercise for the scanner, but is not required.
            <h2>EBNF</h2>
            <a href="http://www.cl.cam.ac.uk/~mgk25/iso-14977.pdf"><font color=#000000>ISO/IEC 14977: 1996(E)</font></a>
            <ul>
                <li>Terminal symbols are quoted
                <li><span class=meta><em><font color=#ff0000 size=4>[</font></em></span> and <span class=meta><em><font color=#ff0000 size=4>]</font></em></span> indicate optional symbols
                <li><span class=meta><em><font color=#ff0000 size=4>{</font></em></span> and <span class=meta><em><font color=#ff0000 size=4>}</font></em></span> indicate repetition
                <li><span class=meta><em><font color=#ff0000 size=4>(</font></em></span> and <span class=meta><em><font color=#ff0000 size=4>)</font></em></span> group items together; the other brackets do too </li>
            </ul>
            <br>
<img src ="http://www.cppblog.com/ngaut/aggbug/48376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-04-28 20:25 <a href="http://www.cppblog.com/ngaut/archive/2008/04/28/48376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inger语法图</title><link>http://www.cppblog.com/ngaut/archive/2008/03/23/45201.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 23 Mar 2008 11:31:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/03/23/45201.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/45201.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/03/23/45201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/45201.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/45201.html</trackback:ping><description><![CDATA[<table nof="LY" border="0" cellpadding="0" cellspacing="0" width="1036">
    <tbody>
        <tr align="left" valign="top">
        </tr>
        <tr align="left" valign="top">
            <td height="102"><br></td>
            <td width="550"><img  src="http://inger.sourceforge.net/assets/images/autogen/Inger_Syntax_Diagrams_NBanner.gif" id="Banner1" alt="Inger syntax diagrams" nof="B_H" border="0" height="102" width="550"></td>
            <td colspan="5"><br></td>
        </tr>
        <tr align="left" valign="top">
            <td height="576"><br></td>
            <td colspan="6" align="center" valign="middle" width="983"><img  src="http://inger.sourceforge.net/assets/images/simplesyntaxdiagrams1.png" id="Picture1" border="0" height="576" width="983"></td>
        </tr>
        <tr align="left" valign="top">
            <td colspan="7" height="5"><br></td>
        </tr>
        <tr align="left" valign="top">
            <td height="704"><br></td>
            <td colspan="3" align="center" valign="middle" width="853"><img  src="http://inger.sourceforge.net/assets/images/simplesyntaxdiagrams2.png" id="Picture2" border="0" height="704" width="853"></td>
            <td colspan="3"><br></td>
        </tr>
        <tr align="left" valign="top">
            <td colspan="7" height="23"><br></td>
        </tr>
        <tr align="left" valign="top">
            <td height="595"><br></td>
            <td colspan="5" align="center" valign="middle" width="980"><img  src="http://inger.sourceforge.net/assets/images/simplesyntaxdiagrams3.png" id="Picture3" border="0" height="595" width="980"></td>
            <td><br></td>
        </tr>
        <tr align="left" valign="top">
            <td colspan="7" height="30"><br></td>
        </tr>
        <tr align="left" valign="top">
            <td height="524"><br></td>
            <td colspan="4" align="center" valign="middle" width="934"><img  src="http://inger.sourceforge.net/assets/images/simplesyntaxdiagrams4.png" id="Picture4" border="0" height="524" width="934"></td>
            <td colspan="2"><br></td>
        </tr>
        <tr align="left" valign="top">
            <td colspan="7" height="33"><br></td>
        </tr>
        <tr align="left" valign="top">
            <td height="447"><br></td>
            <td colspan="2" align="center" valign="middle" width="644"><img  src="http://inger.sourceforge.net/assets/images/simplesyntaxdiagrams5.png" id="Picture5" border="0" height="447" width="644"></td>
            <td colspan="4"><br></td>
        </tr>
    </tbody>
</table><img src ="http://www.cppblog.com/ngaut/aggbug/45201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-03-23 19:31 <a href="http://www.cppblog.com/ngaut/archive/2008/03/23/45201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inger BNF</title><link>http://www.cppblog.com/ngaut/archive/2008/03/23/45200.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 23 Mar 2008 11:30:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/03/23/45200.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/45200.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/03/23/45200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/45200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/45200.html</trackback:ping><description><![CDATA[<p><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif"><strong>Subcollections</strong> </font></p>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp; SET_TYPES = { "bool", "char", "float", "int", "string" }<br>&nbsp; SET_LITERALS = { &lt;boolean_literal&gt;, &lt;char_literal&gt;, &lt;float_literal&gt;, &lt;int_literal&gt;, &lt;string_literal&gt; }<br>&nbsp; SET_INSTRUCTIONS = { "label", "break", "continue", "if", "goto", "while", "do", "switch", "return", ";" }<br>&nbsp; SET_UNARIES = { "&amp;", "*", "~", "+", "-", "!" }<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">module </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  module:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "module" &lt;identifier&gt; ";" globals.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">globals </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  globals: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  globals: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  global globals.<br>&nbsp;&nbsp;  globals: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "extern" global globals.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">global </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  global:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  function.<br>&nbsp;&nbsp;  global:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  declaration.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">function </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  function:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  functionheader functionrest.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">functionheader </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  functionheader:&nbsp; &nbsp; &nbsp;  modifiers &lt;identifier&gt; ":" paramlist "-&gt;" returntype.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">functionrest </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  functionrest:&nbsp; &nbsp; &nbsp; &nbsp;  ";".<br>&nbsp;&nbsp;  functionrest:&nbsp; &nbsp; &nbsp; &nbsp;  block.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">modifiers: </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  modifiers: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  modifiers: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "start".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">paramlist </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  paramlist: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "void".<br>&nbsp;&nbsp;  paramlist: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  paramblock moreparamblocks.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">moreparamblocks </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  moreparamblocks: &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  moreparamblocks: &nbsp; &nbsp;  ";" paramblock moreparamblocks.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">paramblock </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  paramblock:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  type param moreparams.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">moreparams </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  moreparams:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  moreparams:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "," param moreparams.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">param </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  param: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  reference &lt;identifier&gt; dimensionblock.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">returntype </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  returntype:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  type reference dimensionblock.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">reference </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  reference: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  reference: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "*" reference.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">dimensionblock </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  dimensionblock:&nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  dimensionblock:&nbsp; &nbsp; &nbsp;  "[" "]" dimensionblock.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">block </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  block: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "{" code "}".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">code </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  code:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  code:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  block code<br>&nbsp;&nbsp;  code:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  statement code.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">statement </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "label" &lt;identifier&gt; ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "break" ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "continue" ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  expression ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  declarationblock ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "if" "(" expression ")" block elseblock<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "goto" &lt;identifier&gt; ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "while" "(" expression ")" "do" block<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "do" block "while" "(" expression ")" ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "switch" "(" expression ")" "{" switchcases "default" block "}"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "return" returnarg ";".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">returnarg </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  returnarg: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "(" expression ")".<br>&nbsp;&nbsp;  returnarg: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">elseblock </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  elseblock: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  elseblock: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "else" block.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">switchcases </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  switchcases: &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  switchcases: &nbsp; &nbsp; &nbsp; &nbsp;  "case" &lt;int_literal&gt; block swithcases.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">declarationblock </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  declarationblock:&nbsp; &nbsp;  type declaration restdeclarations.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restdeclarations </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restlocals:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restlocals:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "," declaration restdeclarations.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">declaration </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  local: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  reference &lt;identifier&gt; indexblock initializer.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">indexblock </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  indexblock:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  indexblock:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "[" &lt;int_literal&gt; "]" indexblock.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">initializer </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  initializer: &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  initializer: &nbsp; &nbsp; &nbsp; &nbsp;  "=" expression.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">expression </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  expression:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  logicalor restexpression.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restexpression </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restexpression:&nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restexpression:&nbsp; &nbsp; &nbsp;  "=" logicalor restexpression.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">logicalor </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  logicalor: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  logicaland restlogicalor.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restlogicalor </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restlogicalor: &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restlogicalor: &nbsp; &nbsp; &nbsp;  "||" logicaland restlogicalor.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">logicaland </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  logicaland:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  bitwiseor restlogicaland.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restlogicaland </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restlogicaland:&nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restlogicaland:&nbsp; &nbsp; &nbsp;  "&amp;&amp;" bitwiseor restlogicaland.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">bitwiseor </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  bitwiseor: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  bitwisexor restbitwiseor.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restbitwiseor </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restbitwiseor: &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restbitwiseor: &nbsp; &nbsp; &nbsp;  "|" bitwisexor restbitwiseor.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">bitwisexor </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  bitwisexor:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  bitwiseand restbitwisexor.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restbitwisexor </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restbitwisexor:&nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restbitwisexor:&nbsp; &nbsp; &nbsp;  "^" bitwiseand restbitwisexor.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">bitwiseand </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  bitwiseand:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  equality restbitwiseand.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restbitwiseand </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restbitwiseand:&nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restbitwiseand:&nbsp; &nbsp; &nbsp;  "&amp;" equality restbitwiseand.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">equality </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  equality:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  relation restequality.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restequality </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restequality:&nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restequality:&nbsp; &nbsp; &nbsp; &nbsp;  equalityoperator relation restequality.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">equalityoperator </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  equalityoperator:&nbsp; &nbsp;  "==".<br>&nbsp;&nbsp;  equalityoperator:&nbsp; &nbsp;  "!=".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">relation </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  relation:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  shift restrelation.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restrelation </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restrelation:&nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restrelation:&nbsp; &nbsp; &nbsp; &nbsp;  relationoperator shift restrelation.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">relationoperator </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  relationoperator:&nbsp; &nbsp;  "&lt;".<br>&nbsp;&nbsp;  relationoperator:&nbsp; &nbsp;  "&lt;=".<br>&nbsp;&nbsp;  relationoperator:&nbsp; &nbsp;  "&gt;".<br>&nbsp;&nbsp;  relationoperator:&nbsp; &nbsp;  "&gt;=".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">shift </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  shift: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  addition restshift.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restshift </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restshift: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restshift: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  shiftoperator addition restshift.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">shiftoperator </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  shiftoperator: &nbsp; &nbsp; &nbsp;  "&lt;&lt;".<br>&nbsp;&nbsp;  shiftoperator: &nbsp; &nbsp; &nbsp;  "&gt;&gt;".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">addition </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  addition:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  multiplication restaddition.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restaddition </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restaddition:&nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  restaddition:&nbsp; &nbsp; &nbsp; &nbsp;  additionoperator multiplication restaddition.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">additionoperator </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  additionoperator:&nbsp; &nbsp;  "+".<br>&nbsp;&nbsp;  additionoperator:&nbsp; &nbsp;  "-".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">multiplication </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  multiplication:&nbsp; &nbsp; &nbsp;  unary3 restmultiplication.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">restmultiplication </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  restmultiplication:&nbsp;  e.<br>&nbsp;&nbsp;  restmultiplication:&nbsp;  multiplicationoperator unary3 restmultiplication.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">multiplicationoperator </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  multiplicationoperator: "*".<br>&nbsp;&nbsp;  multiplicationoperator: "/".<br>&nbsp;&nbsp;  multiplicationoperator: "%".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">unary3 </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  unary3:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  unary2<br>&nbsp;&nbsp;  unary3:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  unary3operator unary3.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">unary3operator: </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  unary3operator:&nbsp; &nbsp; &nbsp;  "&amp;".<br>&nbsp;&nbsp;  unary3operator:&nbsp; &nbsp; &nbsp;  "*".<br>&nbsp;&nbsp;  unary3operator:&nbsp; &nbsp; &nbsp;  "~".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">unary2 </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  unary2:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  factor.<br>&nbsp;&nbsp;  unary2:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  unary2operator unary2.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">unary2operator </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  unary2operator:&nbsp; &nbsp; &nbsp;  "+".<br>&nbsp;&nbsp;  unary2operator:&nbsp; &nbsp; &nbsp;  "-".<br>&nbsp;&nbsp;  unary2operator:&nbsp; &nbsp; &nbsp;  "!".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">factor </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  factor:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;identifier&gt; application.<br>&nbsp;&nbsp;  factor:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  immediate.<br>&nbsp;&nbsp;  factor:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "(" expression ")".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">application </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  application: &nbsp; &nbsp; &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  application: &nbsp; &nbsp; &nbsp; &nbsp;  "[" expression "]" application.<br>&nbsp;&nbsp;  application: &nbsp; &nbsp; &nbsp; &nbsp;  "(" expression moreexpressions ")".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">moreexpressions </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  moreexpressions: &nbsp; &nbsp;  e.<br>&nbsp;&nbsp;  moreexpressions: &nbsp; &nbsp;  "," expression morexpressions.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">type </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  type:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "bool".<br>&nbsp;&nbsp;  type:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "char".<br>&nbsp;&nbsp;  type:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "float".<br>&nbsp;&nbsp;  type:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "int".<br>&nbsp;&nbsp;  type:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "string".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">immediate </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  immediate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;boolean_literal&gt;.<br>&nbsp;&nbsp;  immediate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;char_literal&gt;.<br>&nbsp;&nbsp;  immediate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;float_literal&gt;.<br>&nbsp;&nbsp;  immediate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;int_literal&gt;.<br>&nbsp;&nbsp;  immediate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;string_literal&gt;.</font></pre><img src ="http://www.cppblog.com/ngaut/aggbug/45200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-03-23 19:30 <a href="http://www.cppblog.com/ngaut/archive/2008/03/23/45200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inger EBNF</title><link>http://www.cppblog.com/ngaut/archive/2008/03/23/45198.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 23 Mar 2008 11:04:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/03/23/45198.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/45198.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/03/23/45198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/45198.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/45198.html</trackback:ping><description><![CDATA[<p><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif"><strong><em>Modules </em></strong></font></p>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">module </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  module:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "module" &lt;identifier&gt; ";" {[extern] global}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">global </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  global:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  function | declaration.<br>&nbsp;</font></pre>
<h3><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif"><em>Functions </em></font></h3>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">function </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  function:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  functionheader [ ";" | block ].<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">functionheader </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  functionheader:&nbsp; &nbsp; &nbsp;  ["start"] &lt;identifier&gt; ":" paramlist "-&gt;" returntype.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">paramlist </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  paramlist: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "void" | paramblock {";" paramblock}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">paramblock </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  paramblock:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  type param {"," param}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">param </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  param: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  {"*"} &lt;identifier&gt; {"[" "]"}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">returntype </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  returntype:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  type {"*"} {"[" "]"}.<br>&nbsp;</font></pre>
<h3><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif"><em>Blocks and statements </em></font></h3>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">block </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  block: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "{" { statement | block } "}".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">statement </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "label" &lt;identifier&gt; ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "break" ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "continue" ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  expression ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  declarationblock ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "if" "(" expression ")" block [ "else" block ].<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "goto" &lt;identifier&gt; ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "while" "(" expression ")" "do" block<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "do" block "while" "(" expression ")" ";"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "switch" "(" expression ")" "{" { "case" &lt;int_literal&gt; block } "default" block "}"<br>&nbsp;&nbsp;  statement: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "return" <u>"(" expression ")"<!--  End navbar  Page title  --><br><!--  Begin browse  $Id: browse.tmpl,v 1.22 2002/02/19 23:00:26 carstenklapp Exp $  --><br><a  href="http://inger.sourceforge.net/html/%22%28%22%20expression%20%22%29%22?action=edit"><img  src="http://inger.sourceforge.net/html/%5Cwiki%5Cthemes%5CMacOSX%5Cbuttons%5Cuww.png" id="Picture12" alt="?" align="bottom" border="0" height="5" hspace="0" vspace="0" width="5"></a></u> ";".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">declarationblock </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  declarationblock:&nbsp; &nbsp;  type declaration {"," declaration}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">declaration </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  local: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  {"*"} &lt;identifier&gt; {"[" &lt;int_literal&gt; "]"} [ "=" expression ].<br>&nbsp;</font></pre>
<h3><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif"><em>Expressions </em></font></h3>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Assignment </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  expression:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  logicalor {"=" logicalor expression}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Logical OR </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  logicalor: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  logicaland {"||" logicaland logicalor}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Logical AND </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  logicaland:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  bitwiseor {"&amp;&amp;" bitwiseor logicaland}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Bitwise OR </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  bitwiseor: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  bitwisexor {"|" bitwisexor bitwiseor}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Bitwise XOR </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  bitwisexor:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  bitwiseand {"^" bitwiseand bitwisexor}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Bitwise AND </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  bitwiseand:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  equality {"&amp;" equality bitwiseand}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Equality </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  equality:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  relation {("==" | "!=") relation equality}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Relation </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  relation:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  shift {("&lt;" | "&lt;=" | "&gt;" | "&gt;=") shift relation}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Bitwise shift </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  shift: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  addition {("&lt;&lt;" | "&gt;&gt;") addition shift}.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Addition/subtraction </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  addition:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  multiplication {("+" | "-") multiplication addition}<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Multiplication/division </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  multiplication:&nbsp; &nbsp; &nbsp;  unary3 {("*" | "/" | "%") unary3 multiplication}.<br>&nbsp;</font></pre>
<h3><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif"><em>Unary operations </em></font></h3>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Reference, indirection and bitwise complement </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  unary3:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  {("&amp;" | "*" | "~")} unary2.<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">Unary negation, unary plus and logical NOT </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  unary2:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  {("+" | "-" | "!")} factor.<br>&nbsp;</font></pre>
<h3><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif"><em>Factor and application </em></font></h3>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">factor </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  factor:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;identifier&gt; [application] | immediate | "(" expression ")".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">application </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  application: &nbsp; &nbsp; &nbsp; &nbsp;  "[" expression "]" application | "(" expression {"," expression } ")".<br>&nbsp;</font></pre>
<h3><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif"><em>Types and immediates </em></font></h3>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">type </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  type:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  "bool" | "char" | "float" | "int" | "string".<br>&nbsp;</font></pre>
<h4><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">immediate </font></h4>
<pre><font face="Arial,Helvetica,Univers,Zurich BT,sans-serif">&nbsp;&nbsp;  immediate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;boolean_literal&gt; | &lt;char_literal&gt; | &lt;float_literal&gt; | &lt;int_literal&gt; | &lt;string_literal&gt;.</font></pre><img src ="http://www.cppblog.com/ngaut/aggbug/45198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-03-23 19:04 <a href="http://www.cppblog.com/ngaut/archive/2008/03/23/45198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inger源码分析--预处理</title><link>http://www.cppblog.com/ngaut/archive/2008/01/05/40481.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sat, 05 Jan 2008 14:01:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/01/05/40481.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/40481.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/01/05/40481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/40481.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/40481.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preprocessorFilename = (char *) malloc( strlen( argv[optind] ) + 3 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy( preprocessorFilename, argv[optind] );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat( preprocessorFilename, "_p" );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Call the preprocessor. It will store its result in<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * preprocessorFilename. If the preprocessor could not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * open the input file, skip this file.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 建立一个新文件，文件名为原来的.i文件加上.p,如果输入的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件名是while.i,则生成的经过预处理的文件名为while.i_p，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里说的预处理和c语言是一样的，即将相应的头文件拷贝过来，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如#import "printint.ih"，则将#import "printint.ih"替换为<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printint.ih文件的内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = Preprocess( argv[optind], preprocessorFilename );</p>
<img src ="http://www.cppblog.com/ngaut/aggbug/40481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-01-05 22:01 <a href="http://www.cppblog.com/ngaut/archive/2008/01/05/40481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inger源码笔记 杂乱</title><link>http://www.cppblog.com/ngaut/archive/2008/01/03/40366.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Thu, 03 Jan 2008 15:14:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/01/03/40366.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/40366.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/01/03/40366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/40366.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/40366.html</trackback:ping><description><![CDATA[先记在这里，有时间再来仔细整理：<br>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">词法分析：<br>关键字定义:</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">/* This enum contains all the keywords and operators<br>&nbsp;* used in the language.<br>&nbsp;*/<br>enum<br>{<br>&nbsp;&nbsp;&nbsp; /* Keywords */<br>&nbsp;&nbsp;&nbsp; KW_BREAK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1000, /* "break" keyword */<br>&nbsp;&nbsp;&nbsp; KW_CASE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "case" keyword */<br>&nbsp;&nbsp;&nbsp; KW_CONTINUE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "continue" keyword */<br>&nbsp;&nbsp;&nbsp; KW_DEFAULT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "default" keyword */<br>&nbsp;&nbsp;&nbsp; KW_DO,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "do" keyword */<br>&nbsp;&nbsp;&nbsp; KW_ELSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "else" keyword */<br>&nbsp;&nbsp;&nbsp; KW_EXTERN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "extern" keyword */<br>&nbsp;&nbsp;&nbsp; KW_GOTO,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "goto" keyword */<br>&nbsp;&nbsp;&nbsp; KW_IF,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "if" keyword */<br>&nbsp;&nbsp;&nbsp; KW_LABEL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "label" keyword */<br>&nbsp;&nbsp;&nbsp; KW_MODULE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "module" keyword */<br>&nbsp;&nbsp;&nbsp; KW_RETURN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "return"keyword */<br>&nbsp;&nbsp;&nbsp; KW_START,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "start" keyword */<br>&nbsp;&nbsp;&nbsp; KW_SWITCH,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "switch" keyword */<br>&nbsp;&nbsp;&nbsp; KW_WHILE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "while" keyword */</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; /* Type identifiers */<br>&nbsp;&nbsp;&nbsp; KW_BOOL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "bool" identifier */<br>&nbsp;&nbsp;&nbsp; KW_CHAR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "char" identifier */<br>&nbsp;&nbsp;&nbsp; KW_FLOAT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "float" identifier */<br>&nbsp;&nbsp;&nbsp; KW_INT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "int" identifier */<br>&nbsp;&nbsp;&nbsp; KW_UNTYPED,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "untyped" identifier */<br>&nbsp;&nbsp;&nbsp; KW_VOID,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "void" identifier */</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; /* Variable lexer tokens */<br>&nbsp;&nbsp;&nbsp; LIT_BOOL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* bool constant */<br>&nbsp;&nbsp;&nbsp; LIT_CHAR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* character constant */<br>&nbsp;&nbsp;&nbsp; LIT_FLOAT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* floating point constant */<br>&nbsp;&nbsp;&nbsp; LIT_INT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* integer constant */<br>&nbsp;&nbsp;&nbsp; LIT_STRING,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* string constant */<br>&nbsp;&nbsp;&nbsp; IDENTIFIER,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* identifier */</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; /* Operators */<br>&nbsp;&nbsp;&nbsp; OP_ADD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "+"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_ASSIGN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "="&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_BITWISE_AND,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "&amp;" */<br>&nbsp;&nbsp;&nbsp; OP_BITWISE_COMPLEMENT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "~"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_BITWISE_LSHIFT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "&lt;&lt;" */<br>&nbsp;&nbsp;&nbsp; OP_BITWISE_OR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "|" */<br>&nbsp;&nbsp;&nbsp; OP_BITWISE_RSHIFT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "&gt;&gt;" */<br>&nbsp;&nbsp;&nbsp; OP_BITWISE_XOR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "^"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_DIVIDE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "/"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_EQUAL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "==" */<br>&nbsp;&nbsp;&nbsp; OP_GREATER,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "&gt;"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_GREATEREQUAL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "&gt;=" */<br>&nbsp;&nbsp;&nbsp; OP_LESS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "&lt;"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_LESSEQUAL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "&lt;=" */<br>&nbsp;&nbsp;&nbsp; OP_LOGICAL_AND,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "&amp;&amp;" */<br>&nbsp;&nbsp;&nbsp; OP_LOGICAL_OR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "||" */<br>&nbsp;&nbsp;&nbsp; OP_MODULUS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "%"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_MULTIPLY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "*"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_NOT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "!"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_NOTEQUAL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "!=" */<br>&nbsp;&nbsp;&nbsp; OP_SUBTRACT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "-"&nbsp; */<br>&nbsp;&nbsp;&nbsp; OP_TERNARY_IF,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "?"&nbsp; */<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /* Delimiters */<br>&nbsp;&nbsp;&nbsp; ARROW,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "-&gt;" */<br>&nbsp;&nbsp;&nbsp; LBRACE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "{"&nbsp; */<br>&nbsp;&nbsp;&nbsp; RBRACE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "}"&nbsp; */<br>&nbsp;&nbsp;&nbsp; LBRACKET,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "["&nbsp; */<br>&nbsp;&nbsp;&nbsp; RBRACKET,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "]"&nbsp; */<br>&nbsp;&nbsp;&nbsp; COLON,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ":"&nbsp; */<br>&nbsp;&nbsp;&nbsp; COMMA,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ","&nbsp; */<br>&nbsp;&nbsp;&nbsp; LPAREN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "("&nbsp; */<br>&nbsp;&nbsp;&nbsp; RPAREN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ")"&nbsp; */<br>&nbsp;&nbsp;&nbsp; SEMICOLON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ";"&nbsp; */<br>}<br>tokens;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span>&nbsp;</p>
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br>处理inger中的各种数据类型和标识符，如BOOL, unsigned long, float, char*,标识符等<br>typedef union<br>{<br>&nbsp;&nbsp;&nbsp; unsigned long&nbsp; uintvalue;<br>&nbsp;&nbsp;&nbsp; BOOL&nbsp;&nbsp;&nbsp; boolvalue;<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; *stringvalue;<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp;&nbsp; charvalue;<br>&nbsp;&nbsp;&nbsp; float&nbsp;&nbsp; floatvalue;<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; *identifier;<br>} Tokenvalue;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br>树节点结构(注意：树节点和抽象语法树节点是不同的)：<br>typedef struct TreeNode<br>{<br>&nbsp;&nbsp;&nbsp; void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *data;<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; screenX;<br>&nbsp;&nbsp;&nbsp; struct TreeNode *parent;<br>&nbsp;&nbsp;&nbsp; List&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *children;&nbsp;//一系列孩子<br>} TreeNode;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">抽象语法树节点结构：<br>typedef struct AstNode<br>{<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id;&nbsp;&nbsp;//表示节点的类型，如while节点，module节点<br>&nbsp;&nbsp;&nbsp; Tokenvalue&nbsp; val;<br>&nbsp;&nbsp;&nbsp; Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *type;<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lineno;<br>} AstNode;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">抽象语法树的AstNode作为TreeNode的data成员保存，参考如下函数：<br>//参数id表示节点名，如：NODE_MODULE,NODE_GLOBAL等见nodenames.h<br>TreeNode *CreateAstNode( int id, int lineno )<br>{<br>&nbsp;&nbsp;&nbsp; TreeNode *treeNode;<br>&nbsp;&nbsp;&nbsp; AstNode *astNode;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; astNode = (AstNode *) MallocEx( sizeof( AstNode ) );<br>&nbsp;&nbsp;&nbsp; astNode-&gt;id = id;<br>&nbsp;&nbsp;&nbsp; astNode-&gt;lineno = lineno;<br>&nbsp;&nbsp;&nbsp; astNode-&gt;val.uintvalue = 0;<br>&nbsp;&nbsp;&nbsp; astNode-&gt;type = NULL;<br>&nbsp;&nbsp;&nbsp; treeNode = CreateTreeNode( astNode );</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; return( treeNode );<br>}<br>或者：<br>TreeNode *CreateAstNodeVal( int id, Tokenvalue val, int lineno )<br>{<br>&nbsp;&nbsp;&nbsp; TreeNode *treeNode;<br>&nbsp;&nbsp;&nbsp; AstNode *astNode;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; astNode = (AstNode *) MallocEx( sizeof( AstNode ) );<br>&nbsp;&nbsp;&nbsp; astNode-&gt;id = id;<br>&nbsp;&nbsp;&nbsp; astNode-&gt;lineno = lineno;<br>&nbsp;&nbsp;&nbsp; astNode-&gt;val = val;<br>&nbsp;&nbsp;&nbsp; astNode-&gt;type = NULL;<br>&nbsp;&nbsp;&nbsp; treeNode = CreateTreeNode( astNode );</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; return( treeNode );<br>}</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br>//抽象语法树节点名<br>enum NodeNames <br>{<br>&nbsp;&nbsp;&nbsp; NODE_MODULE = 0,<br>&nbsp;&nbsp;&nbsp; NODE_START,<br>&nbsp;&nbsp;&nbsp; NODE_EXTERN,<br>&nbsp;&nbsp;&nbsp; NODE_GLOBAL,<br>&nbsp;&nbsp;&nbsp; NODE_FUNCTION,<br>&nbsp;&nbsp;&nbsp; NODE_FUNCTIONHEADER,<br>&nbsp;&nbsp;&nbsp; NODE_MODIFIERS,<br>&nbsp;&nbsp;&nbsp; NODE_PARAMLIST,<br>&nbsp;&nbsp;&nbsp; NODE_PARAMBLOCK,<br>&nbsp;&nbsp;&nbsp; NODE_PARAM,<br>&nbsp;&nbsp;&nbsp; NODE_RETURNTYPE,<br>&nbsp;&nbsp;&nbsp; NODE_DIMENSION,<br>&nbsp;&nbsp;&nbsp; NODE_DIMENSIONBLOCK,<br>&nbsp;&nbsp;&nbsp; NODE_BLOCK,<br>&nbsp;&nbsp;&nbsp; NODE_STATEMENT,<br>&nbsp;&nbsp;&nbsp; NODE_SWITCH,<br>&nbsp;&nbsp;&nbsp; NODE_CASES,<br>&nbsp;&nbsp;&nbsp; NODE_CASE,<br>&nbsp;&nbsp;&nbsp; NODE_WHILE,<br>&nbsp;&nbsp;&nbsp; NODE_GOTO,<br>&nbsp;&nbsp;&nbsp; NODE_LABEL,<br>&nbsp;&nbsp;&nbsp; NODE_IF,<br>&nbsp;&nbsp;&nbsp; NODE_IDENT,<br>&nbsp;&nbsp;&nbsp; NODE_RETURN,<br>&nbsp;&nbsp;&nbsp; NODE_CONTINUE,<br>&nbsp;&nbsp;&nbsp; NODE_BREAK,<br>&nbsp;&nbsp;&nbsp; NODE_DECLBLOCK,<br>&nbsp;&nbsp;&nbsp; NODE_DECLARATION,<br>&nbsp;&nbsp;&nbsp; NODE_INITIALIZER,<br>&nbsp;&nbsp;&nbsp; NODE_INDEXBLOCK,<br>&nbsp;&nbsp;&nbsp; NODE_REFERENCE,<br>&nbsp;&nbsp;&nbsp; NODE_INDEX,<br>&nbsp;&nbsp;&nbsp; NODE_EXPRESSION,<br>&nbsp;&nbsp;&nbsp; NODE_LOGICAL_OR,<br>&nbsp;&nbsp;&nbsp; NODE_LOGICAL_AND,<br>&nbsp;&nbsp;&nbsp; NODE_BITWISE_OR,<br>&nbsp;&nbsp;&nbsp; NODE_BITWISE_XOR,<br>&nbsp;&nbsp;&nbsp; NODE_BITWISE_AND,<br>&nbsp;&nbsp;&nbsp; NODE_EQUAL,<br>&nbsp;&nbsp;&nbsp; NODE_NOTEQUAL,<br>&nbsp;&nbsp;&nbsp; NODE_GREATER,<br>&nbsp;&nbsp;&nbsp; NODE_GREATEREQUAL,<br>&nbsp;&nbsp;&nbsp; NODE_LESS,<br>&nbsp;&nbsp;&nbsp; NODE_LESSEQUAL,<br>&nbsp;&nbsp;&nbsp; NODE_BITWISE_LSHIFT,<br>&nbsp;&nbsp;&nbsp; NODE_BITWISE_RSHIFT,<br>&nbsp;&nbsp;&nbsp; NODE_ASSIGN,<br>&nbsp;&nbsp;&nbsp; NODE_BINARY_ADD,<br>&nbsp;&nbsp;&nbsp; NODE_BINARY_SUBTRACT,<br>&nbsp;&nbsp;&nbsp; NODE_UNARY_ADD,<br>&nbsp;&nbsp;&nbsp; NODE_UNARY_SUBTRACT,<br>&nbsp;&nbsp;&nbsp; NODE_MULTIPLY,<br>&nbsp;&nbsp;&nbsp; NODE_DIVIDE,<br>&nbsp;&nbsp;&nbsp; NODE_MODULUS,<br>&nbsp;&nbsp;&nbsp; NODE_BITWISE_COMPLEMENT,<br>&nbsp;&nbsp;&nbsp; NODE_ADDRESS,<br>&nbsp;&nbsp;&nbsp; NODE_DEREFERENCE,<br>&nbsp;&nbsp;&nbsp; NODE_NOT,<br>&nbsp;&nbsp;&nbsp; NODE_APPLICATION,<br>&nbsp;&nbsp;&nbsp; NODE_INDEXER,<br>&nbsp;&nbsp;&nbsp; NODE_ARGUMENTS,<br>&nbsp;&nbsp;&nbsp; NODE_FACTOR,</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; NODE_BOOL,<br>&nbsp;&nbsp;&nbsp; NODE_CHAR,<br>&nbsp;&nbsp;&nbsp; NODE_FLOAT,<br>&nbsp;&nbsp;&nbsp; NODE_INT,<br>&nbsp;&nbsp;&nbsp; NODE_UNTYPED,<br>&nbsp;&nbsp;&nbsp; NODE_VOID,</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; NODE_LIT_BOOL,<br>&nbsp;&nbsp;&nbsp; NODE_LIT_CHAR,<br>&nbsp;&nbsp;&nbsp; NODE_LIT_FLOAT,<br>&nbsp;&nbsp;&nbsp; NODE_LIT_INT,<br>&nbsp;&nbsp;&nbsp; NODE_LIT_STRING,<br>&nbsp;&nbsp;&nbsp; NODE_LIT_IDENTIFIER,</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; NODE_INT_TO_FLOAT,<br>&nbsp;&nbsp;&nbsp; NODE_CHAR_TO_INT,<br>&nbsp;&nbsp;&nbsp; NODE_CHAR_TO_FLOAT,</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; NODE_UNKNOWN = -1<br>};</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br>输出抽象语法树：<br>/*<br>&nbsp;* PRINTING ROUTINES<br>&nbsp;*/<br>void PrintAst( TreeNode *source )<br>{<br>&nbsp;&nbsp;&nbsp; PrintTree( source, GetAstNodeData, 4 );<br>}<br>PrintTree的实现如下，这里传递的参数levels等于4<br>void PrintTree( TreeNode *source, DataFunction dataFunction, int levels )<br>{<br>&nbsp;&nbsp;&nbsp; int printDepth = 0;<br>&nbsp;&nbsp;&nbsp; BOOL loop;<br>&nbsp;&nbsp;&nbsp; char *str;<br>&nbsp;&nbsp;&nbsp; int i;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; /* TODO: We're going to have to make a new macro.<br>&nbsp;&nbsp;&nbsp;&nbsp; * Don't use DEBUG for this.<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; DEBUG( "Called\n" );</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; /* If tree is empty, abort. */<br>&nbsp;&nbsp;&nbsp; if( source == NULL )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; /* Walk through tree to determine x-offsets for<br>&nbsp;&nbsp;&nbsp;&nbsp; * each node.<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; LayoutTree( source, LEFT_OFFSET );</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">/* Print nodes. */<br>依次通过调用函数指针dataFunction所指向的函数(实际上是函数GetAstNodeData)<br>来输出每个节点的节点名，节点的token的值，类型名，以及行号，参考下面的GetAstNodeData函数</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; for( i = 0; i &lt; levels; i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = dataFunction( source, i );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintChars( source-&gt;screenX - strlen( str ) / 2, ' ' );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf( "%s\n", str );<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; PrintChars( source-&gt;screenX, ' ' );<br>&nbsp;&nbsp;&nbsp; printf( "%c", VERTBAR );</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; printDepth = 0;<br>&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentX = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintNode( source, 0, printDepth, 0, dataFunction, 0 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentX = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintNode( source, 0, printDepth, 1, dataFunction, 0 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentX = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( i = 0; i &lt; levels; i++ )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintNode( source, 0, printDepth, 2, dataFunction, i );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentX = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop = PrintNode( source, 0, printDepth, 3, dataFunction, 0 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printDepth++;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; while( loop );<br>}</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">添加一个孩子的操作只需要将新节点插入到孩子链表尾部即可<br>void AddTreeChild( TreeNode *parentnode, TreeNode *node )<br>{<br>&nbsp;&nbsp;&nbsp; /* Do not act on an empty node. */<br>&nbsp;&nbsp;&nbsp; if( node == NULL ) return;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; /* If the tree is empty, add the first root node. */<br>&nbsp;&nbsp;&nbsp; if( parentnode == NULL )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent = NULL;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; /* Tree is not empty. Add the new node to [parentnode]'s<br>&nbsp;&nbsp;&nbsp;&nbsp; * children list. */<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent = parentnode;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListAppend( parentnode-&gt;children, node );<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">而RemoveAstNode则删除整个子树<br>/* Remove node [node] from ast. The node contents<br>&nbsp;* and its children get deleted.<br>&nbsp;*<br>&nbsp;* Pre:&nbsp; [node] is not NULL.<br>&nbsp;*/<br>void RemoveAstNode( TreeNode *node );</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br>inger编译流程：<br>1.&nbsp;预处理，关键函数为Preprocess<br>2.&nbsp;语法分析，构建抽象语法树，关键函数Parse，Parse也是构造抽象语法树的入口函数，如果语法分析没有发现错误则跳到第3步<br>3.&nbsp;根据抽象语法树来建立符号表关键函数为CreateSymbolTable( ast );<br>4.&nbsp;语义分析，关键函数：<br>a)&nbsp;CheckLeftValues( ast );<br>b)&nbsp;CheckArgCount( ast );<br>c)&nbsp;CheckSwitchStatements( ast );<br>d)&nbsp;CheckFunctionReturns( ast );</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">5.&nbsp; 根据抽象语法树生成代码，关键函数GenerateCode( ast );</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/ngaut/aggbug/40366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-01-03 23:14 <a href="http://www.cppblog.com/ngaut/archive/2008/01/03/40366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的递归下降分析表达式的例子</title><link>http://www.cppblog.com/ngaut/archive/2007/12/25/39612.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 25 Dec 2007 11:36:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/12/25/39612.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/39612.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/12/25/39612.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/39612.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/39612.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 好友学习递归时无法理解用递归下降的方式分析表达式，所以写了个简单的例子，为了使代码尽可能简单，省略了此法分析模块，直接使用人脑分析的词法^_^由于好友不懂c++，所以这里虽然用的c++，但还是按照c的方式写的代码。#include&nbsp;&lt;vector&gt;#include&nbsp;&lt;iostream&gt;#include&nbsp;&lt;assert.h&gt;usi...&nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2007/12/25/39612.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/39612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-12-25 19:36 <a href="http://www.cppblog.com/ngaut/archive/2007/12/25/39612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的正则表达式(转)</title><link>http://www.cppblog.com/ngaut/archive/2007/03/13/19707.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 13 Mar 2007 04:54:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/03/13/19707.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/19707.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/03/13/19707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/19707.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/19707.html</trackback:ping><description><![CDATA[
		<p>
				<span style="color: rgb(0, 0, 0);">        常用的正则表达式(转)<br /></span>
		</p>
		<p>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^\d+$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">非负整数（正整数 + 0） </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^[0-9]*[1-9][0-9]*$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">正整数 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^((-\d+)|(0+))$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">非正整数（负整数 + 0） </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^-[0-9]*[1-9][0-9]*$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">负整数 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^-?\d+$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">整数 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^\d+(\.\d+)?$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">非负浮点数（正浮点数 + 0） </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">正浮点数 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^((-\d+(\.\d+)?)|(0+(\.0+)?))$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">非正浮点数（负浮点数 + 0） </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">负浮点数 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^(-?\d+)(\.\d+)?$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">浮点数 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^[A-Za-z]+$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">由26个英文字母组成的字符串 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^[A-Z]+$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">由26个英文字母的大写组成的字符串 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^[a-z]+$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">由26个英文字母的小写组成的字符串 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^[A-Za-z0-9]+$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">由数字和26个英文字母组成的字符串 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^\w+$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">由数字、26个英文字母或者下划线组成的字符串 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">email地址 </span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">　　</span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">url</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" target="_blank">
						</a>
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">/^</span>
				<span style="color: rgb(0, 0, 0);">(d</span>
				<span id="Codehighlighter1_768_770_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						<a href="http://www.cnblogs.com/Images/dot.gif" target="_blank">
						</a>
				</span>
				<span id="Codehighlighter1_768_770_Open_Text">
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0);">2</span>
						<span style="color: rgb(0, 0, 0);">}</span>
				</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">d</span>
				<span id="Codehighlighter1_774_776_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						<a href="http://www.cnblogs.com/Images/dot.gif" target="_blank">
						</a>
				</span>
				<span id="Codehighlighter1_774_776_Open_Text">
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0);">4</span>
						<span style="color: rgb(0, 0, 0);">}</span>
				</span>
				<span style="color: rgb(0, 0, 0);">)</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">((</span>
				<span style="color: rgb(0, 0, 0);">0</span>
				<span style="color: rgb(0, 0, 0);">([</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">9</span>
				<span style="color: rgb(0, 0, 0);">]</span>
				<span id="Codehighlighter1_788_790_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						<a href="http://www.cnblogs.com/Images/dot.gif" target="_blank">
						</a>
				</span>
				<span id="Codehighlighter1_788_790_Open_Text">
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0);">1</span>
						<span style="color: rgb(0, 0, 0);">}</span>
				</span>
				<span style="color: rgb(0, 0, 0);">))</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">(</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">[</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">2</span>
				<span style="color: rgb(0, 0, 0);">]))</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">(([</span>
				<span style="color: rgb(0, 0, 0);">0</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">2</span>
				<span style="color: rgb(0, 0, 0);">]([</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">9</span>
				<span style="color: rgb(0, 0, 0);">]</span>
				<span id="Codehighlighter1_817_819_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						<a href="http://www.cnblogs.com/Images/dot.gif" target="_blank">
						</a>
				</span>
				<span id="Codehighlighter1_817_819_Open_Text">
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0);">1</span>
						<span style="color: rgb(0, 0, 0);">}</span>
				</span>
				<span style="color: rgb(0, 0, 0);">))</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">(</span>
				<span style="color: rgb(0, 0, 0);">3</span>
				<span style="color: rgb(0, 0, 0);">[</span>
				<span style="color: rgb(0, 0, 0);">0</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">]))$</span>
				<span style="color: rgb(0, 0, 0);">/</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">  年-月-日</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" target="_blank">
						</a>
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">/^</span>
				<span style="color: rgb(0, 0, 0);">((</span>
				<span style="color: rgb(0, 0, 0);">0</span>
				<span style="color: rgb(0, 0, 0);">([</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">9</span>
				<span style="color: rgb(0, 0, 0);">]</span>
				<span id="Codehighlighter1_858_860_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						<a href="http://www.cnblogs.com/Images/dot.gif" target="_blank">
						</a>
				</span>
				<span id="Codehighlighter1_858_860_Open_Text">
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0);">1</span>
						<span style="color: rgb(0, 0, 0);">}</span>
				</span>
				<span style="color: rgb(0, 0, 0);">))</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">(</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">[</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">2</span>
				<span style="color: rgb(0, 0, 0);">]))</span>
				<span style="color: rgb(0, 0, 0);">/</span>
				<span style="color: rgb(0, 0, 0);">(([</span>
				<span style="color: rgb(0, 0, 0);">0</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">2</span>
				<span style="color: rgb(0, 0, 0);">]([</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">-</span>
				<span style="color: rgb(0, 0, 0);">9</span>
				<span style="color: rgb(0, 0, 0);">]</span>
				<span id="Codehighlighter1_888_890_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						<a href="http://www.cnblogs.com/Images/dot.gif" target="_blank">
						</a>
				</span>
				<span id="Codehighlighter1_888_890_Open_Text">
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0);">1</span>
						<span style="color: rgb(0, 0, 0);">}</span>
				</span>
				<span style="color: rgb(0, 0, 0);">))</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">(</span>
				<span style="color: rgb(0, 0, 0);">3</span>
				<span style="color: rgb(0, 0, 0);">[</span>
				<span style="color: rgb(0, 0, 0);">0</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">1</span>
				<span style="color: rgb(0, 0, 0);">]))</span>
				<span style="color: rgb(0, 0, 0);">/</span>
				<span style="color: rgb(0, 0, 0);">(d</span>
				<span id="Codehighlighter1_908_910_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						<a href="http://www.cnblogs.com/Images/dot.gif" target="_blank">
						</a>
				</span>
				<span id="Codehighlighter1_908_910_Open_Text">
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0);">2</span>
						<span style="color: rgb(0, 0, 0);">}</span>
				</span>
				<span style="color: rgb(0, 0, 0);">|</span>
				<span style="color: rgb(0, 0, 0);">d</span>
				<span id="Codehighlighter1_914_916_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
						<a href="http://www.cnblogs.com/Images/dot.gif" target="_blank">
						</a>
				</span>
				<span id="Codehighlighter1_914_916_Open_Text">
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0);">4</span>
						<span style="color: rgb(0, 0, 0);">}</span>
				</span>
				<span style="color: rgb(0, 0, 0);">)$</span>
				<span style="color: rgb(0, 0, 0);">/</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);"> 月/日/年</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">Emil</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">     </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">电话号码</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
						<a href="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" target="_blank">
						</a>
				</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);">IP地址</span>
				<br />
		</p>
		<p> </p>
		<p>匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br />匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />匹配空行的正则表达式：\n[\s| ]*\r<br />匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/<br />匹配首尾空格的正则表达式：(^\s*)|(\s*$)<br />匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />匹配网址URL的正则表达式：^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$<br />匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />匹配国内电话号码：(\d{3}-|\d{4}-)?(\d{8}|\d{7})?<br />匹配腾讯QQ号：^[1-9]*[1-9][0-9]*$<br /></p>
		<p>
				<u>下表是元字符及其在正则表达式上下文中的行为的一个完整列表： <br /></u>
				<br />
				<strong>\</strong> 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。<br /><br /><strong>^</strong> 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性，^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。 <br /><br /><strong>$</strong> 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性，$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。 <br /><br /><strong>*</strong> 匹配前面的子表达式零次或多次。 <br /><br /><strong>+</strong> 匹配前面的子表达式一次或多次。+ 等价于 {1,}。 <br /><br /><strong>?</strong> 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 <br /><br /><strong>{n}</strong> n 是一个非负整数，匹配确定的n 次。<br /><br /><strong>{n,}</strong> n 是一个非负整数，至少匹配n 次。 <br /><br /><strong>{n,m}</strong> m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。<br /><br /><strong>?</strong> 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 <br /><br /><strong>.</strong> 匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符，请使用象 ’[.\n]’ 的模式。 <br /><strong>(pattern)</strong> 匹配pattern 并获取这一匹配。 <br /><br /><strong>(?:pattern)</strong> 匹配pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。 <br /><br /><strong>(?=pattern)</strong> 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。 <br /><br /><strong>(?!pattern)</strong> 负向预查，与<strong>(?=pattern)</strong>作用相反 <br /><br /><strong>x|y</strong> 匹配 x 或 y。 <br /><br /><strong>[xyz]</strong> 字符集合。 <br /><br /><strong>[^xyz]</strong> 负值字符集合。 <br /><br /><strong>[a-z]</strong> 字符范围，匹配指定范围内的任意字符。 <br /><br /><strong>[^a-z]</strong> 负值字符范围，匹配任何不在指定范围内的任意字符。 <br /><br /><strong>\b</strong> 匹配一个单词边界，也就是指单词和空格间的位置。<br /><br /><strong>\B</strong> 匹配非单词边界。 <br /><br /><strong>\cx</strong> 匹配由x指明的控制字符。 <br /><br /><strong>\d</strong> 匹配一个数字字符。等价于 [0-9]。 <br /><br /><strong>\D</strong> 匹配一个非数字字符。等价于 [^0-9]。 <br /><br /><strong>\f</strong> 匹配一个换页符。等价于 \x0c 和 \cL。 <br /><br /><strong>\n</strong> 匹配一个换行符。等价于 \x0a 和 \cJ。 <br /><br /><strong>\r</strong> 匹配一个回车符。等价于 \x0d 和 \cM。 <br /><br /><strong>\s</strong> 匹配任何空白字符，包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 <br /><br /><strong>\S</strong> 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 <br /><br /><strong>\t</strong> 匹配一个制表符。等价于 \x09 和 \cI。 <br /><br /><strong>\v</strong> 匹配一个垂直制表符。等价于 \x0b 和 \cK。 <br /><br /><strong>\w</strong> 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 <br /><br /><strong>\W</strong> 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。 <br /><br /><strong>\xn</strong> 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。<br /><br /><strong>\num</strong> 匹配 num，其中num是一个正整数。对所获取的匹配的引用。 <br /><br /><strong>\n</strong> 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。 <br /><br /><strong>\nm</strong>
标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm
为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m
均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。 <br /><br /><strong>\nml</strong> 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。 <br /><br /><strong>\un</strong> 匹配 n，其中 n 是一个用四个十六进制数字表示的Unicode字符。 <br /></p>
		<p>匹配中文字符的正则表达式： [u4e00-u9fa5]</p>
		<p>匹配双字节字符(包括汉字在内)：[^x00-xff]</p>
		<p>应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）</p>
		<p>String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}</p>
		<p>匹配空行的正则表达式：n[s| ]*r</p>
		<p>匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;/1&gt;|&lt;(.*) /&gt;/ </p>
		<p>匹配首尾空格的正则表达式：(^s*)|(s*$)</p>
		<p>应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：</p>
		<p>String.prototype.trim = function()<br />{<br />return this.replace(/(^s*)|(s*$)/g, "");<br />}</p>
		<p>利用正则表达式分解和转换IP地址：</p>
		<p>下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：</p>
		<p>function IP2V(ip)<br />{<br />re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式<br />if(re.test(ip))<br />{<br />return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />}<br />else<br />{<br />throw new Error("Not a valid IP address!")<br />}<br />}</p>
		<p>不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：</p>
		<p>var ip="10.100.20.168"<br />ip=ip.split(".")<br />alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))</p>
		<p>匹配Email地址的正则表达式：w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*</p>
		<p>匹配网址URL的正则表达式：http://([w-]+.)+[w-]+(/[w- ./?%&amp;=]*)?</p>
		<p>利用正则表达式去除字串中重复的字符的算法程序：</p>
		<p>var s="abacabefgeeii"<br />var s1=s.replace(/(.).*1/g,"$1")<br />var re=new RegExp("["+s1+"]","g")<br />var s2=s.replace(re,"") <br />alert(s1+s2) //结果为：abcefgi</p>
		<p>我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。</p>
		<p>得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1</p>
		<p>s="http://www.9499.net/page1.htm"<br />s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2")<br />alert(s)</p>
		<p>利用正则表达式限制网页表单里的文本框输入内容：</p>
		<p>用
正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')"
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"</p>
		<p>用
正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')"
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"</p>
		<p>用
正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^d]/g,'')
"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"</p>
		<p>用
正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[W]/g,'')
"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"</p>
<img src ="http://www.cppblog.com/ngaut/aggbug/19707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-03-13 12:54 <a href="http://www.cppblog.com/ngaut/archive/2007/03/13/19707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译器inger源码分析(四) － 词法分析辅助模块</title><link>http://www.cppblog.com/ngaut/archive/2007/02/05/18403.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 05 Feb 2007 12:53:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/02/05/18403.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/18403.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/02/05/18403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/18403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/18403.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 真正的词法分析是用lex完成的，这里只是一些辅助定义和辅助函数&nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2007/02/05/18403.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/18403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-02-05 20:53 <a href="http://www.cppblog.com/ngaut/archive/2007/02/05/18403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译器inger源码分析(三) 抽象双链表－具体实现</title><link>http://www.cppblog.com/ngaut/archive/2007/02/05/18401.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 05 Feb 2007 12:39:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/02/05/18401.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/18401.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/02/05/18401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/18401.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/18401.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 双链表本身不难，但是写一个没有错误的双链表就有点难了&nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2007/02/05/18401.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/18401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-02-05 20:39 <a href="http://www.cppblog.com/ngaut/archive/2007/02/05/18401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译器inger源码分析(二) 抽象双链表－接口</title><link>http://www.cppblog.com/ngaut/archive/2007/02/05/18396.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 05 Feb 2007 10:45:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/02/05/18396.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/18396.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/02/05/18396.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/18396.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/18396.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: inger源码分析(二) 抽象双链表－接口定义&nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2007/02/05/18396.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/18396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-02-05 18:45 <a href="http://www.cppblog.com/ngaut/archive/2007/02/05/18396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译器inger源码分析(一)  错误报告模块</title><link>http://www.cppblog.com/ngaut/archive/2007/02/04/18326.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 04 Feb 2007 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/02/04/18326.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/18326.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/02/04/18326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/18326.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/18326.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 错误报告模块分析&nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2007/02/04/18326.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/18326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-02-04 16:20 <a href="http://www.cppblog.com/ngaut/archive/2007/02/04/18326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从今天开始分析编译器inger的源代码</title><link>http://www.cppblog.com/ngaut/archive/2007/02/04/18323.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 04 Feb 2007 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/02/04/18323.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/18323.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/02/04/18323.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/18323.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/18323.html</trackback:ping><description><![CDATA[版本inger 0.3, windows平台采用Code::Blocks编译, 底层使用gcc.<br /><br />先简单说几句, 从代码上看，inger代码清晰，优美，注释充足，是难得的阅读分析佳品。<br /><br />整个编译器使用c语言编写，从难度和清晰度来看，是我见过的最漂亮的c代码(实际上我读过的代码很少，汗)，<br /><br />词法分析部分使用了lex。好像也不比手写轻松多少^_^<br /><br /><img src ="http://www.cppblog.com/ngaut/aggbug/18323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-02-04 15:36 <a href="http://www.cppblog.com/ngaut/archive/2007/02/04/18323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]词法分析器采取的操作</title><link>http://www.cppblog.com/ngaut/archive/2007/01/17/17705.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 16 Jan 2007 20:53:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/01/17/17705.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/17705.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/01/17/17705.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/17705.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/17705.html</trackback:ping><description><![CDATA[
		<h2 id="afd1b0gaco">词法分析器采取的操作</h2>
		<p>
				<a id="idx888" name="idx888">
				</a>
		</p>
		<a name="a2406570253soni">
		</a>
		<p id="a2406570253soni">当词法分析器与说明文件规则部分中的一个扩展正则表达式匹配时，它执行与扩展正则表达式相对应的<em>操作</em>。没有足够的规则匹配输入流中的所有字符串，词法分析器则将输入复制到标准输出。因此，不要创建仅将输入复制到输出的规则。缺省的输出能够帮助在规则中查找间隔。</p>
		<a name="a2406570329soni">
		</a>
		<p id="a2406570329soni">当使用 <strong>lex</strong> 命令处理由 <strong>yacc</strong> 命令产生的解析器的输入时，请提供与所有输入字符串匹配的规则。那些规则必须生成 <strong>yacc</strong> 命令能够解释的输出。</p>
		<a name="a282968d">
		</a>
		<h3 id="a282968d">空操作</h3>
		<a name="a2406570457soni">
		</a>
		<p id="a2406570457soni">要忽略与扩展正则表达式关联的输入，请使用 ;（C 语言空语句）作为操作。下面的示例忽略了三个间隔字符（空白、制表符和换行）：</p>
		<a name="a282968f">
		</a>
		<pre class="xmp" id="a282968f">[ \t\n] ;</pre>
		<a name="a2829691">
		</a>
		<h3 id="a2829691">与下一个操作相同</h3>
		<a name="a2406570637soni">
		</a>
		<p id="a2406570637soni">要避免反复写相同的操作，请使用 |（管道符号）。此字符指示此规则的操作与下一条规则的操作相同。例如，先前忽略空白、制表符和换行字符的示例也可写成：</p>
		<a name="a2829693">
		</a>
		<pre class="xmp" id="a2829693">" "                     |
"\t"                    |
"\n"                    ;</pre>
		<a name="a2406570770soni">
		</a>
		<p id="a2406570770soni">
				<tt>\n</tt> 和 <tt>\t</tt> 两边的引号并不需要。</p>
		<a name="a2829695">
		</a>
		<h3 id="a2829695">打印匹配字符串</h3>
		<a id="idx889" name="idx889">
		</a>
		<a name="a2406570904soni">
		</a>
		<p id="a2406570904soni">要确定哪个文本与说明文件的规则部分的表达式匹配，您可以包扩 C 语言 <a href="http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.basetechref/doc/basetrf1/printf.htm"><strong>printf</strong></a> 子例程调用作为该表达式的一个操作。当词法分析器在输入流中找到匹配，程序将匹配字符串放入外部字符（<strong>char</strong>）和宽字符（<strong>wchar_t</strong>）数组中，分别称为 <strong>yytext</strong> 和 <strong>yywtext</strong>。例如，您能使用下面的规则打印匹配字符串：</p>
		<a name="a2829697">
		</a>
		<pre class="xmp" id="a2829697">[a-z]+            printf("%s",yytext);</pre>
		<a name="a2406571039soni">
		</a>
		<p id="a2406571039soni">C 语言 <strong>printf</strong> 子例程接受格式参数和要打印的数据。在此示例中，<strong>printf</strong> 子例程的参数具有下面的含义：</p>
		<a name="wq374">
		</a>
		<table id="wq374" rules="none" width="100%" summary="" border="0" frame="void">
				<tbody valign="top">
						<tr>
								<td width="11%">
										<a id="a2829699" name="a2829699">
										</a>
										<strong>%s</strong>
								</td>
								<td width="88%">在打印之前将数据转换为类型字符串的符号</td>
						</tr>
						<tr>
								<td>
										<a id="a182c159" name="a182c159">
										</a>
										<strong>%S</strong>
								</td>
								<td>在打印之前将数据转换为宽字符串（<strong>wchar_t</strong>）的符号</td>
						</tr>
						<tr>
								<td>
										<a id="a282969a" name="a282969a">
										</a>
										<strong>yytext</strong>
								</td>
								<td>包含要打印的数据的数组的名称</td>
						</tr>
						<tr>
								<td>
										<a id="a182c15a" name="a182c15a">
										</a>
										<strong>yywtext</strong>
								</td>
								<td>包含要打印的多字节类型（<strong>wchar_t</strong>）数据的数组名称</td>
						</tr>
				</tbody>
		</table>
		<a name="a2406571403soni">
		</a>
		<p id="a2406571403soni">
				<a id="idx890" name="idx890">
				</a>
				<strong>lex</strong> 命令定义 <strong>ECHO</strong>；作为要打印 <strong>yytext</strong> 的内容的特殊操作。例如，下面的两条规则是等价的：</p>
		<a name="dbbdd4b862mela">
		</a>
		<pre class="xmp" id="dbbdd4b862mela">[a-z]+       ECHO;
[a-z]+       printf("%s",yytext);</pre>
		<a name="a2406571538soni">
		</a>
		<p id="a2406571538soni">您可以在 <strong>lex</strong> 说明文件的定义部分使用 <strong>%array</strong> 或者 <strong>%pointer</strong> 如下更改 <strong>yytext</strong> 的说明：</p>
		<a name="wq375">
		</a>
		<table id="wq375" rules="none" width="100%" summary="" border="0" frame="void">
				<tbody valign="top">
						<tr>
								<td width="13%">
										<a id="d722d45976mela" name="d722d45976mela">
										</a>
										<strong>%array</strong>
								</td>
								<td width="86%">将 <strong>yytext</strong> 定义为以 null 结束的字符数组。这是缺省操作。</td>
						</tr>
						<tr>
								<td>
										<a id="d722d46024mela" name="d722d46024mela">
										</a>
										<strong>%pointer</strong>
								</td>
								<td>将 <strong>yytext</strong> 定义为指向以 null 结束的字符串的指针。</td>
						</tr>
				</tbody>
		</table>
		<a name="a282969d">
		</a>
		<h3 id="a282969d">查找匹配字符串的长度</h3>
		<a name="a2406571866soni">
		</a>
		<p id="a2406571866soni">
				<a id="idx891" name="idx891">
				</a>
				<a id="idx892" name="idx892">
				</a>要查找词法分析器与特定的扩展正则表达式所匹配的字符数，请使用 <strong>yyleng</strong> 或者 <strong>yywleng</strong> 外部变量。</p>
		<a name="wq376">
		</a>
		<table id="wq376" rules="none" width="100%" summary="" border="0" frame="void">
				<tbody valign="top">
						<tr>
								<td width="11%">
										<strong>yyleng</strong>
								</td>
								<td width="88%">跟踪匹配的字节数。</td>
						</tr>
						<tr>
								<td>
										<strong>yywleng</strong>
								</td>
								<td>跟踪匹配字符串中的宽字符数。多字节字符的长度大于 1。</td>
						</tr>
				</tbody>
		</table>
		<a name="a2406571940soni">
		</a>
		<p id="a2406571940soni">要对输入的字数和字中的字符数进行计数，请使用下面的操作：</p>
		<a name="a282969f">
		</a>
		<pre class="xmp" id="a282969f">[a-zA-Z]+       {words++;chars += yyleng;}</pre>
		<a name="a2406572075soni">
		</a>
		<p id="a2406572075soni">此操作总计匹配的字中的字符数，并将该数字赋予 <tt>chars</tt>。</p>
		<a name="a2406572150soni">
		</a>
		<p id="a2406572150soni">下面的表达式在匹配字符串中查找最后一个字符：</p>
		<a name="a28296a2">
		</a>
		<pre class="xmp" id="a28296a2">yytext[yyleng-1]</pre>
		<a name="d722d47070mela">
		</a>
		<h3 id="d722d47070mela">匹配字符串中的字符串</h3>
		<p>
				<a id="idx893" name="idx893">
				</a>
		</p>
		<a name="a2406572400soni">
		</a>
		<p id="a2406572400soni">
				<strong>lex</strong> 命令对输入流进行分区，并不搜索每个表达式的所有可能的匹配字符串。每个字符仅计算一次。要覆盖此选项并搜索可能重叠或者互相包含的项，请使用 <strong>REJECT</strong> 操作。例如，要对 <tt>she</tt> 和 <tt>he</tt> 的所有实例（包括包含在 <tt>she</tt> 中的 <tt>he</tt>）计数，请使用下面的操作：</p>
		<a name="d722d47168mela">
		</a>
		<pre class="xmp" id="d722d47168mela">she              {s++; REJECT;}
he               {h++}
\n          |.           ;</pre>
		<a name="a2406572539soni">
		</a>
		<p id="a2406572539soni">在对 <tt>she</tt> 的出现次数进行计数后，<strong>lex</strong> 命令拒绝输入字符串，然后对 <tt>he</tt> 的出现次数进行计数。因为 <tt>he</tt> 并不包括 <tt>she</tt>，所以 <strong>REJECT</strong> 操作不必在 <tt>he</tt> 上。</p>
		<a name="a28296a3">
		</a>
		<h3 id="a28296a3">将结果添加到 yytext 数组</h3>
		<a name="a2406572725soni">
		</a>
		<p id="a2406572725soni">典型情况下，来自输入流的下一个字符串覆盖 <strong>yytext</strong> 数组中的当前项。如果您使用 <strong>yymore</strong> 子例程，来自输入流的下一个字符串将被添加到 <strong>yytext</strong> 数组的当前项的尾部。</p>
		<a name="a2406572800soni">
		</a>
		<p id="a2406572800soni">例如，下面的词法分析器搜索字符串：</p>
		<a name="dbbdd4c629mela">
		</a>
		<pre class="xmp" id="dbbdd4c629mela">%s instring
%%
&lt;INITIAL&gt;\"     {  /* start of string */
         BEGIN instring;
         yymore();
        }
&lt;instring&gt;\"    {  /* end of string */
         printf("matched %s\n", yytext);
         BEGIN INITIAL;
        }
&lt;instring&gt;.     {
         yymore();
        }
&lt;instring&gt;\n    {
         printf("Error, new line in string\n");
         BEGIN INITIAL;
        }</pre>
		<a name="a2406572938soni">
		</a>
		<p id="a2406572938soni">尽管通过匹配多个规则，字符串可能被识别，但是反复调用 <strong>yymore</strong> 子例程可以确保 <strong>yytext</strong> 数组包含整个字符串。</p>
		<a name="a28296ab">
		</a>
		<h3 id="a28296ab">将字符返回到输入流</h3>
		<a name="a2406573126soni">
		</a>
		<p id="a2406573126soni">要将字符返回给输入流，请使用下面的调用：</p>
		<a name="a28296ad">
		</a>
		<pre class="xmp" id="a28296ad">yyless(n)</pre>
		<a name="a2406573252soni">
		</a>
		<p id="a2406573252soni">其中 <tt>n</tt> 是当前字符串中要保持的字符数。字符串中超过此数目的字符被返回到输入流。<strong>yyless</strong> 子例程提供的先行函数类型与 <tt>/</tt>（斜杠）运算符所使用的相同，但是它允许更多对其用法的控制。</p>
		<a name="a2406573329soni">
		</a>
		<p id="a2406573329soni">不止一次使用 <strong>yyless</strong> 子例程处理文本。例如，当语法分析 C 语言程序时，诸如 <tt>x=-a</tt> 之类的表达式很难理解。它表示 <tt>x</tt><em>等于</em><tt>-a</tt>，还是 <tt>x -= a</tt> 的旧的表述形式（意味着将 <tt>x</tt><em>减去</em><em>值</em><tt>a</tt>）？要将此表达式作为 <tt>x</tt><em>等于</em><tt>-a</tt> 处理，但是要打印警告消息则请使用如下的规则：</p>
		<a name="a28296b0">
		</a>
		<pre class="xmp" id="a28296b0">=-[a-zA-Z]      {
                printf("Operator (=-) ambiguous\n");
                yyless(yyleng-1);
                ... action for = ...
                }</pre>
		<a name="a28296b1">
		</a>
		<h3 id="a28296b1">输入／输出子例程</h3>
		<a id="idx894" name="idx894">
		</a>
		<a name="a2406573576soni">
		</a>
		<p id="a2406573576soni">
				<strong>lex</strong> 程序允许程序使用下述输入／输出（I/O）子例程：</p>
		<a name="wq377">
		</a>
		<table id="wq377" rules="none" width="100%" summary="" border="0" frame="void">
				<tbody valign="top">
						<tr>
								<td width="16%">
										<a id="a28296b3" name="a28296b3">
										</a>
										<strong>input()</strong>
								</td>
								<td width="83%">返回下一个输入字符</td>
						</tr>
						<tr>
								<td>
										<a id="a28296b4" name="a28296b4">
										</a>
										<strong>output(c)</strong>
								</td>
								<td>将字符 c 写到输出</td>
						</tr>
						<tr>
								<td>
										<a id="a28296b5" name="a28296b5">
										</a>
										<strong>unput(c)</strong>
								</td>
								<td>将字符 c 推回输入流，稍后再通过 <strong>input</strong> 子例程读出</td>
						</tr>
						<tr>
								<td>
										<a id="a182c15b" name="a182c15b">
										</a>
										<strong>winput()</strong>
								</td>
								<td>返回下一个多字节输入字符</td>
						</tr>
						<tr>
								<td>
										<a id="a182c15c" name="a182c15c">
										</a>
										<strong>woutput(C)</strong>
								</td>
								<td>将多字节字符 C 写回输出流</td>
						</tr>
						<tr>
								<td>
										<a id="a182c15d" name="a182c15d">
										</a>
										<strong>wunput(C)</strong>
								</td>
								<td>将多字节字符 C 推回输入流，以通过 <strong>winput</strong> 子例程读出</td>
						</tr>
				</tbody>
		</table>
		<a name="a2406574114soni">
		</a>
		<p id="a2406574114soni">
				<strong>lex</strong> 程序提供这些子例程作为宏定义。子例程的代码在 <strong>lex.yy.c</strong> 文件中。您能覆盖它们并提供其他版本。</p>
		<a name="a2406574190soni">
		</a>
		<p id="a2406574190soni">定义 <strong>winput</strong>、<strong>wunput</strong> 和 <strong>woutput</strong> 宏以使用 <strong>yywinput</strong>、<strong>yywunput</strong> 和 <strong>yywoutput</strong> 子例程。考虑到兼容性，<strong>yy</strong> 子例程随后使用 <strong>input</strong>、<strong>unput</strong> 和 <strong>output</strong> 子例程来读、写和替换完全多字节字符中需要数目的字节。</p>
		<a name="a2406574267soni">
		</a>
		<p id="a2406574267soni">这些子例程定义外部文件和内部字符之间的关系。如果您更改子例程，请以相同的方式将它们全部更改。这些子例程应该遵循这些规则：</p>
		<ul>
				<li>所有的子例程必须使用相同的字符集。 
</li>
				<li>
						<strong>input</strong> 子例程必须返回 0 值以指示文件的末尾。 
</li>
				<li>不要更改 <strong>unput</strong> 子例程和 <strong>input</strong> 子例程的关系，否则先行函数会不起作用。</li>
		</ul>
		<a name="a2406574574soni">
		</a>
		<p id="a2406574574soni">
				<strong>lex.yy.c</strong> 文件允许词法分析器最多备份 200 个字符。</p>
		<a name="a2406574651soni">
		</a>
		<p id="a2406574651soni">要读包含 NULL 的文件，请创建不同版本的 <strong>input</strong> 子例程。在 <strong>input</strong> 子例程的正常版本中，（从空字符）返回的值 0 表明这是文件的末尾，且将终止输入。</p>
		<a name="a28296bd">
		</a>
		<h3 id="a28296bd">字符集</h3>
		<a name="a2406574781soni">
		</a>
		<p id="a2406574781soni">
				<strong>lex</strong> 命令生成的词法分析器通过 <strong>input、output</strong> 和 <strong>unput</strong> 子例程处理字符 I/O。因此，要在 <strong>yytext</strong> 子例程中返回值，<strong>lex</strong> 命令使用这些子例程使用的字符说明。但是，在内部 <strong>lex</strong> 命令使用小整数代表每一个字符。当使用标准库时，此整数是计算机用来表示字符的位模式的值。正常情况下，字母 <em>a</em> 用与字符常量 <em>a</em> 相同的格式表示。如果您使用不同的 I/O 子例程更改此解释，请将转换表放到说明文件的定义部分。转换表在包含下述条目的行开始和结束：</p>
		<a name="a28296bf">
		</a>
		<pre class="xmp" id="a28296bf">%T</pre>
		<a name="a2406574903soni">
		</a>
		<p id="a2406574903soni">转换表包含指示与每个字符关联的值的其他行。例如：</p>
		<a name="a28296c1">
		</a>
		<pre class="xmp" id="a28296c1">%T
{integer}       {character string}
{integer}       {character string}
{integer}       {character string}
%T</pre>
		<a name="a348f918">
		</a>
		<h3 id="a348f918">文件末尾处理</h3>
		<a id="idx895" name="idx895">
		</a>
		<a name="a2406575112soni">
		</a>
		<p id="a2406575112soni">当词法分析器到达文件末尾时，它调用 <strong>yywrap</strong> 库子例程，此调用返回值 1，指示词法分析器应该继续在输入末尾正常结束。</p>
		<p>但是，如果词法分析器从多个源接收到输入，请更改 <strong>yywrap</strong> 子例程。新的函数必须获取新的输入并将值 0 返回给词法分析器。返回值 0 指示程序应该继续处理。</p>
		<a name="a2406575187soni">
		</a>
		<p id="a2406575187soni">您也可以包含代码，以在词法分析器在新版本的 <strong>yywrap</strong> 子例程中终止时，打印摘要报告和表。<strong>yywrap</strong> 子例程是强制 <strong>yylex</strong> 子例程识别输入末尾的唯一途径。</p>
<img src ="http://www.cppblog.com/ngaut/aggbug/17705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-01-17 04:53 <a href="http://www.cppblog.com/ngaut/archive/2007/01/17/17705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译原理学习笔记：词法分析</title><link>http://www.cppblog.com/ngaut/archive/2006/07/14/9847.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 14 Jul 2006 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/07/14/9847.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/9847.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/07/14/9847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/9847.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/9847.html</trackback:ping><description><![CDATA[
		<p>词法分析主要完成的工作有：<br />1.过滤源程序中的空白字符和注释。<br />2.识别各种常量，并且把字符形式的表示转化为编译器的内部标识(如：int a = 6,在编译器看来，这些都是以字符形式表示的)<br />3.识别标识符(ID)和关键字(keyword)<br />4.识别源程序中的各种符号(如："+", "-", "(", "]"等)</p>
		<p>
				<br />java(gjc)词法分析器优点：<br />  1.所有的源文件一次读入到内存缓冲区buf[]中，对随后的操作有一定的简化作用，<br />    并使得词法分析速度有一定的提高。<br />  2.词法分析的出错点报告精确到具体的行和列：line, col。觉得没有必要精确到列。<br />  3.通过scanChar()来预读一个字符，然后根据预读的字符来推测该token可能的类型<br />    然后调用相应的函数来处理。抽象程度更高，值得学习。<br />    <br />  <br />  <br /></p>
<img src ="http://www.cppblog.com/ngaut/aggbug/9847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2006-07-14 14:54 <a href="http://www.cppblog.com/ngaut/archive/2006/07/14/9847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【实习收获】如果遇到这样的错误：lex.yy.c:  undefined reference to `yywrap'</title><link>http://www.cppblog.com/ngaut/archive/2006/07/05/9450.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Wed, 05 Jul 2006 10:52:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/07/05/9450.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/9450.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/07/05/9450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/9450.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/9450.html</trackback:ping><description><![CDATA[可以在lex.c加入如下的行来解决问题。<br />#define yywrap()  1<br /><br />更好的办法是定义:<br />int yywrap() <br />{ <br />   return(1); <br />} <br /><br />关于yywrap更详细的信息可以参考unix的lex manual<br /><a href="http://www.scit.wlv.ac.uk/cgi-bin/mansec?1+lex">http://www.scit.wlv.ac.uk/cgi-bin/mansec?1+lex</a><br /><br /><font color="#cc3300">int yywrap(void)<br />           Called by yylex at  end-of-file;  the  default  yywrap<br />           always  will  return  1.  If  the application requires<br />           yylex to continue processing with  another  source  of<br />           input,  then  the  application  can include a function<br />           yywrap, which associates another file with the  exter-<br />           nal  variable  FILE  *<em>yyin</em>  and will return a value of<br />           zero.<br /></font><br />或flex的参考手册(这个貌似更广泛一点)：<br /><a href="http://www.gnu.org/software/flex/manual/html_mono/flex.html">http://www.gnu.org/software/flex/manual/html_mono/flex.html</a><br /><br /><p><font color="#ff0000">When the scanner receives an end-of-file indication from YY_INPUT, it then checks the <samp>`yywrap()'</samp> function. If <samp>`yywrap()'</samp> returns false (zero), then it is assumed that the function has gone ahead and set up <code>yyin</code> to point to another input file, and scanning continues. If it returns true (non-zero), then the scanner terminates, returning 0 to its caller. Note that in either case, the start condition remains unchanged; it does <em>not</em> revert to <code>INITIAL</code>. </font></p><p><font color="#ff0000">If you do not supply your own version of <samp>`yywrap()'</samp>, then you must either use <samp>`%option noyywrap'</samp> (in which case the scanner behaves as though <samp>`yywrap()'</samp> returned 1), or you must link with <samp>`-lfl'</samp> to obtain the default version of the routine, which always returns 1. </font></p><img src ="http://www.cppblog.com/ngaut/aggbug/9450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2006-07-05 18:52 <a href="http://www.cppblog.com/ngaut/archive/2006/07/05/9450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>