﻿<?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++博客-woaidongmao-随笔分类-YACC &amp; LEX</title><link>http://www.cppblog.com/woaidongmao/category/8306.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Fri, 19 Sep 2008 17:23:05 GMT</lastBuildDate><pubDate>Fri, 19 Sep 2008 17:23:05 GMT</pubDate><ttl>60</ttl><item><title>终于成功配置lex和yacc的工具Parser Generator</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/20/62313.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 19 Sep 2008 16:16:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/20/62313.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/62313.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/20/62313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/62313.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/62313.html</trackback:ping><description><![CDATA[<p>用的<span lang="EN-US">VC 2005, </span>和原来<span lang="EN-US">VC 6</span>的设置项对应不上<span lang="EN-US">, </span>很多半天都找不到<span lang="EN-US">.</span>好不容易找全了<span lang="EN-US">, </span>却还是编译出错<span lang="EN-US">.<br></span>最后<span lang="EN-US">,</span>只好选择再装一个<span lang="EN-US">VC6, </span>嗯<span lang="EN-US">, </span>两个<span lang="EN-US">VC, </span>不错<span lang="EN-US">.<br><br></span>先介绍一下<span lang="EN-US">Parser Generator,</span>主页下载<span lang="EN-US">:<a href="http://www.bumblebeesoftware.com/downloads.htm" target="_blank">http://www.bumblebeesoftware.com/downloads.htm</a><br>Parser Generator is<strong><span style="font-family: 宋体; mso-bidi-font-family: 宋体"> a YACC and Lex programming</span></strong> tool for Windows. As well as including a Graphical User Interace, the software also includes two versions of YACC and Lex, called AYACC and ALex. Parser Generator is able to generate C, C++ and Java parsers and lexical analysers. This includes both Unicode and Multibyte Character Set (MBCS) variants. In your applications you can create multiple, thread safe, instances of these parsers and lexical analysers.<?xml:namespace prefix = o /><o:p></o:p></span></p> <p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>下面说一下<span lang="EN-US">windows</span>环境下<span lang="EN-US">parser generator</span>和<span lang="EN-US">vc++</span>的各项配置<span lang="EN-US"><o:p></o:p></span></p> <p>（一）<span lang="EN-US">parser generator</span>的环境设置<span lang="EN-US"><o:p></o:p></span></p> <p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>安装好<span lang="EN-US">parser generator</span>，打开集成开发环境，点项目<span lang="EN-US">Project</span>菜单，在下拉菜单中选<span lang="EN-US">LibBuilder</span>，弹出<span lang="EN-US">LibBuilder</span>对话框选择属性按钮，弹出<span lang="EN-US">compiler properties </span>对话框：<span lang="EN-US"> <br>&nbsp;&nbsp; Name </span>选择<span lang="EN-US" style="color: red">Visual C++ (32-bit)</span><span lang="EN-US"><o:p></o:p></span></p> <p><span lang="EN-US">&nbsp;&nbsp; Directory <span style="color: red">:msvc32</span><br>&nbsp;&nbsp; options:<o:p></o:p></span></p> <p>依次为 <span lang="EN-US" style="color: red">vc++</span><span style="color: red">版本<span lang="EN-US">(Versoin 6)<br></span></span>是否支持<span lang="EN-US">unicode</span>码。<span lang="EN-US">(</span>选择默认<span lang="EN-US">)<br></span>是否把<span lang="EN-US">w_char_t</span>作为内建类型。<span lang="EN-US">(</span>选择默认<span lang="EN-US">)<br><br></span>下边是<span lang="EN-US">VC</span>的各种目录：<span lang="EN-US"><br></span>依次为<span lang="EN-US"><br><span style="color: red">Compiler Bin Directory (C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\BIN</span><o:p></o:p></span></p> <p><span lang="EN-US" style="color: red">Compiler Bin Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\COMMON\MSDEV98\BIN<o:p></o:p></span></p> <p><span lang="EN-US" style="color: red">Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\INCLUDE<o:p></o:p></span></p> <p><span lang="EN-US" style="color: red">Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\INCLUDE<o:p></o:p></span></p> <p><span lang="EN-US" style="color: red">Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\LIB<o:p></o:p></span></p> <p><span lang="EN-US" style="color: red">Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\LIB</span><span lang="EN-US"><o:p></o:p></span></p> <p><span lang="EN-US">&nbsp;&nbsp;&nbsp; </span>注意：编译器安装目录根据个人安装目录需要做相应的调整。所有的这些设置完成之后点<span lang="EN-US">ok</span>。<span lang="EN-US"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>最后一步<span lang="EN-US">,</span>配置<span lang="EN-US">parser generator</span>的<span lang="EN-US">properties,</span>如图即可<span lang="EN-US">:<o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-size: 12pt"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/lexyaccParserGenerator_3B9/clip_image001_4.gif"><img class="blogimg" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="317" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/lexyaccParserGenerator_3B9/clip_image001_thumb_1.gif" width="427" border="0" v:shapes="_x0000_i1025" small="0"></a><o:p></o:p></span></p> <p><span lang="EN-US"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></span></p> <p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; </span>返回<span lang="EN-US">LibBuilder</span>。点<span lang="EN-US" style="color: red">Build</span>就可以编译<span lang="EN-US">vc++</span>使用的<span lang="EN-US">lex</span>与<span lang="EN-US">yacc</span>的<span lang="EN-US">lib</span>库。<span lang="EN-US"><o:p></o:p></span></p> <p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #993366; font-family: 宋体; mso-bidi-font-family: 宋体">注<span lang="EN-US">:</span>我参考<span lang="EN-US">Vs 2003.net</span>的设置<span lang="EN-US">,</span>在<span lang="EN-US">VC 2005</span>下进行相应设置<span lang="EN-US">, </span>结果<span lang="EN-US">lex</span>与<span lang="EN-US">yacc</span>的<span lang="EN-US">lib</span>库没能编译通过<span lang="EN-US">, </span>可能是我设置错误<span lang="EN-US">, </span>不应该是尚不兼容的问题吧<span lang="EN-US">.</span></span></strong><strong><span lang="EN-US" style="font-family: 宋体; mso-bidi-font-family: 宋体"> </span></strong><span lang="EN-US"><br><br>&nbsp;&nbsp;&nbsp; </span>生成库文件在软件安装目录下的<span lang="EN-US">D:\Parser Generator 2\Cpp\Lib\msvc32</span>目录下。<span lang="EN-US"><o:p></o:p></span></p> <p>（二）<span lang="EN-US">vc++</span>环境的设置<span lang="EN-US"><o:p></o:p></span></p> <p><span lang="EN-US">1.</span>目录设置<span lang="EN-US"><o:p></o:p></span></p> <p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>为了在<span lang="EN-US">VC++</span>中可以找到包含文件<span lang="EN-US">yacc.h</span>和<span lang="EN-US">lex.h</span>以及<span lang="EN-US">YACC</span>和<span lang="EN-US">Lex</span>的库文件，需要对<span lang="EN-US">VC++</span>进行相关的目录设置<span lang="EN-US"><br></span>（<span lang="EN-US">1</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>选择<span lang="EN-US">Tools</span>菜单中的<span lang="EN-US">Options</span>命令，打开<span lang="EN-US">Options</span>对话框。<span lang="EN-US"><br></span>（<span lang="EN-US">2</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>选择<span lang="EN-US">Directories</span>选项卡。<span lang="EN-US"><br></span>（<span lang="EN-US">3</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Show Directories for</span>下拉列表框中选择<span lang="EN-US">Include Files</span>。<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Directories</span>框中，点击最后的空目录，并填入<span lang="EN-US"> F:\PARGEN\CPP\INCLUDE(</span>根据个人安装目录需要做相应的调整<span lang="EN-US">)<br></span>（<span lang="EN-US">4</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Show Directories for</span>下拉列表框中选择<span lang="EN-US">Library Files</span>。<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Directories</span>框中，点击最后的空目录，并填入<span lang="EN-US">F:\PARGEN\CPP\LIB\MSVC32<br></span>（<span lang="EN-US">5</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Show Directories for</span>下拉列表框中选择<span lang="EN-US">Source Files</span>。<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Directories</span>框中，点击最后的空目录，并填入<span lang="EN-US">F:\PARGEN\CPP\SOURCE<br></span>（<span lang="EN-US">6</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>点击<span lang="EN-US">OK</span>按钮<span lang="EN-US">,Options</span>对话框将接受设置并关闭。<span lang="EN-US"><o:p></o:p></span></p> <p><span lang="EN-US">2</span>．项目设置<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; mso-bidi-font-family: 宋体">对于<span style="color: red">每个</span><span lang="EN-US">VC++</span>项目，都需在<span lang="EN-US">VC++</span>中进行以下设置</span></strong>，以使<span lang="EN-US">VC++</span>可以从特定的库中接受<span lang="EN-US">LEX</span>和<span lang="EN-US">YACC</span>所需要的函数和变量<span lang="EN-US"><br></span>（<span lang="EN-US">1</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>选择<span lang="EN-US">Project</span>菜单中的<span lang="EN-US">Settings</span>命令，打开<span lang="EN-US">Project Settings</span>对话框。<span lang="EN-US"><br></span>（<span lang="EN-US">2</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Settings for</span>下拉列表框中选择<span lang="EN-US">Win32 Debug</span>。<span lang="EN-US"><br></span>（<span lang="EN-US">3</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>选择<span lang="EN-US">C/C++</span>选项卡， 在<span lang="EN-US">Category</span>下拉列表框中选择<span lang="EN-US">General</span>。<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Preprocessor Definitions</span>框中，在当前文本的最后，输入<span lang="EN-US"> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>，<span lang="EN-US" style="color: red">YYDEBUG<br></span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; mso-bidi-font-family: 宋体">注<span lang="EN-US">:</span>对应到<span lang="EN-US">VC 2005</span>为<span lang="EN-US">C/C++-&gt;Preprocessor-&gt;Preprocessor Definitions.</span></span></strong><span lang="EN-US"><br></span>（<span lang="EN-US">4</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>选择<span lang="EN-US">Link</span>选项卡，在<span lang="EN-US">Category</span>下拉列表框中选择<span lang="EN-US">General</span>。<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Object/Library Modules</span>框中，在当前文本的后面，输入<span lang="EN-US" style="color: red">yld.lib<br></span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; mso-bidi-font-family: 宋体">注<span lang="EN-US">:VC 6</span>中的<span lang="EN-US">Object/Library Modules</span>对应到<span lang="EN-US">VC 2005</span>为<span lang="EN-US">Propert-&gt;Configuration Properties-&gt;Linker-&gt;Input-&gt;Additional Dependencies ,</span>找了好久<span lang="EN-US">.</span></span></strong><b><span lang="EN-US" style="color: purple"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/lexyaccParserGenerator_3B9/clip_image002_4.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/lexyaccParserGenerator_3B9/clip_image002_thumb_1.gif" width="24" border="0" v:shapes="_x0000_i1026"></a></span></b><span lang="EN-US"><br></span>（<span lang="EN-US">5</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在<span lang="EN-US">Settings for</span>下拉列表框中选择<span lang="EN-US">Win32 Release</span>。<span lang="EN-US"><br></span>（<span lang="EN-US">6</span>）<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; </span>重复第<span lang="EN-US">4</span>步的工作。<span lang="EN-US"><br></span>（<span lang="EN-US">7</span>）<span lang="EN-US">&nbsp;&nbsp; </span>点击<span lang="EN-US">OK</span>按钮，<span lang="EN-US">Project Settings</span>对话框设置完毕。<span lang="EN-US"><o:p></o:p></span></p> <p><span lang="EN-US">&nbsp;&nbsp; </span>这样设置之后我们就可以用<span lang="EN-US">vc++</span>编译<span lang="EN-US">Parser Generator </span>生成的<span lang="EN-US">c</span>文件了。具体为：<span lang="EN-US"><br></span>先打开<span lang="EN-US">Parser Generator </span>集成开发环境。点击<span lang="EN-US">Project</span>菜单，点击下拉菜单中的<span lang="EN-US">ParseWizard</span>菜单，一路下去建立一个工程。然后点击<span lang="EN-US">project</span>菜单下的的<span lang="EN-US">Rebuild All</span>。在项目文件夹下就生成了相应<span lang="EN-US">c</span>文件与<span lang="EN-US">h</span>文件。<span lang="EN-US"><br></span>再用<span lang="EN-US">VC++</span>建立一个空控制台工程，然后把用用<span lang="EN-US">Parser Generator <br></span>生成的<span lang="EN-US">c</span>文件和头文件加入工程中。接着对<span lang="EN-US">VC++</span>进行上面所说的项目设置，然后就可以编译运行了。新手可以使用<span lang="EN-US">parser generator </span>自带的范例，这样方便检验环境的配置是否正确<span lang="EN-US">.<o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-size: 12pt; font-family: arial"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/62313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-20 00:16 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/20/62313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc++与YACC和LEX集成环境步骤(Parser Generator)</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/20/62312.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 19 Sep 2008 16:10:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/20/62312.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/62312.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/20/62312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/62312.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/62312.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text"> <div align="left"><font size="2">在这里，将介绍由英国<font face="Times New Roman">Bumble-Bee Software</font>公司生产的<font face="Times New Roman">Windows</font>环境下的<font face="Times New Roman">YACC</font>和<font face="Times New Roman">LEX</font>集成环境<font face="Times New Roman">Parser Generator</font>。<font face="Times New Roman">Parser Generator</font>是<font face="Times New Roman">Windows</font>下<font face="Times New Roman">YACC</font>和<font face="Times New Roman">LEX</font>的实现。它包括一个图形用户界面，同时包括<font face="Times New Roman">YACC</font>和<font face="Times New Roman">Lex</font>两个版本，分别叫做<font face="Times New Roman">AYACC</font>和<font face="Times New Roman">Alex</font>。<font face="Times New Roman">Parser Generator</font>非常适合于与<font face="Times New Roman">VC++</font>集成。</font></div><br> <div align="left"><font size="2"><font face="Times New Roman">&nbsp;&nbsp; </font>在安装了<font face="Times New Roman">Parser Generator</font>后，执行以下步骤，即可使<font face="Times New Roman">VC++</font>编译和连接由<font face="Times New Roman">Parser Generator</font>产生的文件。</font></div><br> <div align="left"><font size="2"><font face="Times New Roman">1</font>．目录设置</font></div><br> <div align="left"><font size="2"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">VC++</font>中执行以下步骤，每个步骤只执行一次。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">1</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>选择<font face="Times New Roman">Tools</font>菜单中的<font face="Times New Roman">Options</font>命令，在屏幕上即会出现<font face="Times New Roman">Options</font>对话框。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">2</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>选择<font face="Times New Roman">Directories</font>选项卡。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">3</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Show Directories for</font>下拉列表框中选择<font face="Times New Roman">Include Files</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">4</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Directories</font>框中，点击最后的空目录，并填入<font face="Times New Roman">Parser Generator</font>的<font face="Times New Roman">include</font>子目录的路径。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">5</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Show Directories for</font>下拉列表框中选择<font face="Times New Roman">Library Files</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">6</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Directories</font>框中，点击最后的空目录，并填入<font face="Times New Roman">Parser Generator</font>的<font face="Times New Roman">lib\msdev</font>子目录的路径。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">7</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Show Directories for</font>下拉列表框中选择<font face="Times New Roman">Source Files</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">8</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Directories</font>框中，点击最后的空目录，并填入<font face="Times New Roman">Parser Generator</font>的<font face="Times New Roman">Source</font>子目录的路径。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">9</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>点击<font face="Times New Roman">OK</font>按钮,<font face="Times New Roman">Options</font>对话框将接受设置并关闭。</font></div><br> <div align="left"><font size="2"><font face="Times New Roman">VC++</font>在就可以找到包含文件<font face="Times New Roman">yacc.h</font>和<font face="Times New Roman">lex.h</font>以及<font face="Times New Roman">YACC</font>和<font face="Times New Roman">Lex</font>的库文件。</font></div><br> <div align="left"><font size="2"><font face="Times New Roman">2</font>．项目设置</font></div><br> <div align="left"><font size="2"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font>对于每个<font face="Times New Roman">VC++</font>项目，都需在<font face="Times New Roman">VC++</font>中执行以下步骤：</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">1</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>选择<font face="Times New Roman">Project</font>菜单中的<font face="Times New Roman">Settings</font>命令，在屏幕上即会出现<font face="Times New Roman">Project Settings</font>对话框。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">2</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Settings for</font>下拉列表框中选择<font face="Times New Roman">Win32 Debug</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">3</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>选择<font face="Times New Roman">C/C++</font>标签。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">4</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Category</font>下拉列表框中选择<font face="Times New Roman">General</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">5</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Preprocessor Definitions</font>框中，在当前文本的最后，输入<font face="Times New Roman">YYDEBUG</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">6</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>选择<font face="Times New Roman">Link</font>标签。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">7</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Category</font>下拉列表框中选择<font face="Times New Roman">General</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">8</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Object/Library Modules</font>框中，在当前文本的后面，输入<font face="Times New Roman">yld.lib ylmtd.lib ylmtdlld.lib</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">9</font>）<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>在<font face="Times New Roman">Settings for</font>下拉列表框中选择<font face="Times New Roman">Win32 Release</font>。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">10</font>）<font face="Times New Roman">&nbsp;&nbsp; </font>重复第<font face="Times New Roman">8</font>步的工作。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">11</font>）<font face="Times New Roman">&nbsp;&nbsp; </font>点击<font face="Times New Roman">OK</font>按钮，<font face="Times New Roman">Project Settings</font>对话框将接受设置并关闭。</font></div><br> <div align="left"><font size="2"><font face="Times New Roman">VC++</font>现在可以从特定的库中接受<font face="Times New Roman">YACC</font>和<font face="Times New Roman">Lex</font>所需的函数和变量。</font></div><br> <div align="left"><font size="2"><font face="Times New Roman">3</font>．应用</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">1</font>）在<font face="Times New Roman">Parser Generator</font>下的编辑窗口输入<font face="Times New Roman">YACC</font>源程序（扩展名必须为<font face="Times New Roman">.y</font>）。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">2</font>）用<font face="Times New Roman">Parser Generator</font>下的<font face="Times New Roman">Project</font>菜单的<font face="Times New Roman">Compile file</font>命令编译源程序，生成相应的<font face="Times New Roman">C</font>语言源程序（<font face="Times New Roman">.cpp</font>）。</font></div><br> <div align="left"><font size="2">（<font face="Times New Roman">3</font>）用<font face="Times New Roman">VC++</font>编译，连接<font face="Times New Roman">C</font>语言源程序，生成可执行程序（<font face="Times New Roman">.exe</font>）后即可执行。</font></div><br> <div align="left"><font size="2">参考文献：</font></div><br> <div align="left"><font size="2"><font face="Times New Roman"> [1]</font> 吕映芝,张素琴,蒋维杜,编译原理.北京: 清华大学出版社, 1998.1</font></div></div><img src ="http://www.cppblog.com/woaidongmao/aggbug/62312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-20 00:10 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/20/62312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM----Yacc 与 Lex 快速入门</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62295.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 19 Sep 2008 10:14:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62295.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/62295.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/62295.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/62295.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上，如果你熟练掌握 Lex 和 Yacc 的话，它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。Ashish Bansal 为您详细的讨论了编写自己的语言和编译器所用到的这两种工具，包括常规表达式、声明、匹配模式、变量、Yacc 语法和解析器代码。最后，他解释了怎样把 Lex 和 Yacc 结合起来。 Lex ...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/09/19/62295.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/62295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-19 18:14 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/19/62295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Yacc 与 Lex 快速入门 Lex 与 Yacc 介绍</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62294.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 19 Sep 2008 10:06:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62294.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/62294.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/62294.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/62294.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Lex 和 Yacc 是 UNIX 的两种非常重要的、功能强大的工具。事实上，如果你熟练掌握 Lex 和 Yacc 的话，它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。 Ashish Bansal 为您详细的讨论了编写自己的语言和编译器所用到的这两种工具，包括常规表达式、声明、匹配模式、变量、Yacc 语法和解析器代码。最后，他解释了怎样将 Lex 和 Yacc 结合起来。 &n...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/09/19/62294.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/62294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-19 18:06 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/19/62294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>yacc / lex 在linux 下 使用指南</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62293.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 19 Sep 2008 10:01:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62293.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/62293.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/62293.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/62293.html</trackback:ping><description><![CDATA[<table cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=right><o:p></o:p></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; Lex 和 Yacc&nbsp;是 Unix 和Linux 下词法和语法的分析，解析工具，有了这两个工具，你可以自己制作想要的编译器，也可以重新制作已有程序语言的解析器。需要注意的是linux下的这两个工具生成的程序源码只能是C和C++语言，当然现在早已有类似可以生成Java源码的语法分析器，如较常用的JavaCC(Java Compiler Compiler)，相关内容可以去网上搜索。Lex和Yacc已被移植到windows下，现在常用的工具有Parser Generator。本文只介绍Linux 下Lex和Yacc的使用方法。<br><br><br>Lex介绍<br><br>Lex 通过对.lex或.l文件定义的格式生成一个C语言源码文件，通过编译这个源码，就生成了.lex文件或.l文件定义的编译器。.lex或.l文件的格式分三段:<br><br><span style="COLOR: red">1.全局变量声明部分<br>2.词法规则部分<br>3.函数定义部分<br></span><br>以下是一个简单的例子：lex_example.l文件<br><br>%{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //全局声明部分<br>/*林木100 linux<br>www.linmu100.com<br>*/<br>#include &lt;stdio.h&gt; &nbsp;<br><br>extern char *yytext;<br>extern FILE *yyin;<br>int sem_count = 0;<br><br>%}<br><br>//规则定义部分，<br>%%<br>[a-zA-Z][a-zA-Z0-9]*&nbsp;&nbsp;&nbsp; {printf("WORD[%s] ", yytext);}<br>[a-zA-Z0-9\/.-]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("FILENAME ");<br>\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("QUOTE ");<br>\{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("OBRACE ");<br>\}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("EBRACE ");<br>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {sem_count++; printf("SEMICOLON ");}<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>[ \t]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ignore whitespace */;<br>%%<br><br>//以下为函数定义部分<br>int main(int avgs, char *avgr[])&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp; yyin = fopen(avgr[1], "r");<br>&nbsp;&nbsp;&nbsp; if (!yyin)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; yylex();<br>&nbsp;&nbsp;&nbsp; printf("sem_count : %d\n", sem_count);<br>&nbsp;&nbsp;&nbsp; fclose(yyin);<br><br>&nbsp;&nbsp;&nbsp; return 1;<br>}<o:p></o:p></p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">Lex 常用格式如下表，常规表达式：<o:p></o:p></p>
<table cellSpacing=1 cellPadding=0 width=590 border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">字符<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">含义<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>A-Z, 0-9, a-z<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">构成了部分模式的字符和数字。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>.<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">匹配任意字符，除了 \n。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>-<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">用来指定范围。例如：A-Z 指从 A 到 Z 之间的所有字符。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>[ ]<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">一个字符集合。匹配括号内的任意&nbsp;字符。如果第一个字符是&nbsp;^&nbsp;那么它表示否定模式。例如: [abC] 匹配 a, b, 和 C中的任何一个。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>*<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">匹配0个或者多个上述的模式。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>+<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">匹配1个或者多个上述模式。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>?<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">匹配0个或1个上述模式。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>$<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">作为模式的最后一个字符匹配一行的结尾。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>{ }<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">指出一个模式可能出现的次数。 例如: A{1,3} 表示 A 可能出现1次或3次。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>\<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">用来转义元字符。同样用来覆盖字符在此表中定义的特殊意义，只取字符的本意。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>^<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">否定。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>|<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">表达式间的逻辑或。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>"&lt;一些符号&gt;"<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">字符的字面含义。元字符具有。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>/<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">向前匹配。如果在匹配的模版中的&#8220;/&#8221;后跟有后续表达式，只匹配模版中&#8220;/&#8221;前面的部分。如：如果输入 A01，那么在模版 A0/1 中的 A0 是匹配的。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>( )<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">将一系列常规表达式分组。<o:p></o:p></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><br>常规表达式举例<o:p></o:p></p>
<table cellSpacing=1 cellPadding=0 width=590 border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="28%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">常规表达式<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="72%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">含义<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="28%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>joke[rs]<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="72%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">匹配 jokes 或 joker。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="28%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>A{1,2}shis+<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="72%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">匹配 AAshis, Ashis, AAshi, Ashi。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="28%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>(A[b-e])+<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="72%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">匹配在 A 出现位置后跟随的从 b 到 e 的所有字符中的 0 个或 1个。<o:p></o:p></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><br><br>使用lex扫描上述举例文件 lex_example.l：<br>lex lex_example.l<br>缺省会生成lex.yy.c文件，然后用gcc编译这个文件，注意要有-ll选项:<br>gcc lex.yy.c -o analyse -ll<br>这样就生成了一个简单的词法分析器analyse，假设有文件demo，其内容如下所示:<br>firstword;<br>secondword;<br>thirdword<br><br>fourthword{<br>fifthword<br>}<br>输入命令:<br>./analyse demo<br>会有如下显示：<br>WORD[firstword] SEMICOLON&nbsp;<br>WORD[secondword] SEMICOLON&nbsp;<br>WORD[thirdword]&nbsp;<br><br>WORD[fourthword] OBRACE&nbsp;<br>WORD[fifthword]&nbsp;<br>EBRACE&nbsp;<br>sem_count : 2<br><br>实际上，对于上述lex_example.l文件，函数定义部分可以完全省略，因为lex会自动为你生成main函数。这时仍然按上述方法生成analyse，输入命令:<br>./analse&nbsp;&lt;&nbsp;demo<br>结果如下：<br>WORD[firstword] SEMICOLON&nbsp;<br>WORD[secondword] SEMICOLON&nbsp;<br>WORD[thirdword]&nbsp;<br><br>WORD[fourthword] OBRACE&nbsp;<br>WORD[fifthword]&nbsp;<br>EBRACE&nbsp;<br><br><br>在上述lex_example.l文件中我们还使用了两个变量：<br>extern char *yytext;<br>extern FILE *yyin;<br>这两个变量是lex提供的外部借口，用户可以根据自己需要自己更改，lex提供了以下接口：<o:p></o:p></p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">Lex 变量<o:p></o:p></p>
<table cellSpacing=1 cellPadding=0 width=590 border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yyin<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">FILE* 类型。 它指向 lexer 正在解析的当前文件。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yyout<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">FILE* 类型。 它指向记录 lexer 输出的位置。 缺省情况下，yyin 和 yyout 都指向标准输入和输出。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yytext<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">匹配模式的文本存储在这一变量中（char*）。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yyleng<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">给出匹配模式的长度。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yylineno<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">提供当前的行数信息。（lexer不一定支持。）<o:p></o:p></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">Lex 函数<o:p></o:p></p>
<table cellSpacing=1 cellPadding=0 width=590 border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yylex()<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">这一函数开始分析。 它由 Lex 自动生成。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yywrap()<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">这 一函数在文件（或输入）的末尾调用。如果函数的返回值是1，就停止解析。 因此它可以用来解析多个文件。代码可以写在第三段，这就能够解析多个文件。 方法是使用 yyin 文件指针（见上表）指向不同的文件，直到所有的文件都被解析。最后，yywrap() 可以返回 1 来表示解析的结束。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yyless(int n)<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">这一函数可以用来送回除了前憂? 个字符外的所有读出标记。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="25%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">yymore()<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" vAlign=top width="75%">
            <p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">这一函数告诉 Lexer 将下一个标记附加到当前标记后。<o:p></o:p></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">以下是一个计算字符个数的.l文件内容，有兴趣的朋友可以编译试试<br>%{&nbsp;<br>/*<br>林木100 linux<br>www.linmu100.com<br>*/<br>int wc = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* word count */&nbsp;<br>%}&nbsp;<br>&nbsp;<br>%%&nbsp;<br>[a-zA-Z]+&nbsp;&nbsp;&nbsp; { wc++; }&nbsp;<br>\n|.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { /* gobble up */ }&nbsp;<br>%%&nbsp;<br>int main(void)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp; int n = yylex();&nbsp;<br>&nbsp;&nbsp;&nbsp; return n;&nbsp;<br>}&nbsp;<br>&nbsp;<br>int yywrap(void)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp; printf("word count: %d\n", wc);&nbsp;<br>&nbsp;&nbsp;&nbsp; return 1;&nbsp;<br>}<br><br>yacc介绍<br><br>Yacc 是 Yet Another Compiler Compiler的缩写。 Yacc 的 GNU 版叫做 Bison。它是一种语法解析工具。它用巴科斯范式(BNF, Backus Naur Form)来书写。按照惯例，Yacc 文件有 .y 后缀。<br>实际上，yacc才是真正分析语法的核心，.y文件格式和.l文件一样分三段，但每一段的意义有所不同：<br>1.全局变量声明，终结符号(终端符号)声明<br>2.语法定义<br>3.函数定义<br><br>以下是一个简单的yacc_example.y文件，定义了一个简单的计算器：<br>%{&nbsp;<br>//全局变量声明&nbsp;<br>#include &lt;ctype.h&gt;&nbsp;<br>#include &lt;stdio.h&gt;&nbsp;<br>#define YYSTYPE double /*double type for YACC stack; for yylval*/&nbsp;<br>&nbsp;<br>/*林木100 www.linmu100.com */&nbsp;<br>&nbsp;<br>void yyerror(const char *str)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp; fprintf(stderr, "error:%s\n", str );&nbsp;<br>}&nbsp;<br>%}&nbsp;<br>//终结符声明&nbsp;<br>%token NUMBER&nbsp;<br>&nbsp;<br>%%&nbsp;<br>lines&nbsp;&nbsp;&nbsp; : lines expr <st1:personname w:st="on">'</st1:personname>\n<st1:personname w:st="on">'</st1:personname>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { printf("%g\n", $2); }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | lines <st1:personname w:st="on">'</st1:personname>\n<st1:personname w:st="on">'</st1:personname>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | /* e */&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | error <st1:personname w:st="on">'</st1:personname>\n<st1:personname w:st="on">'</st1:personname>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { yyerror("reenter last line:"); /*yyerrok(); */}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;<br>&nbsp;<br>expr&nbsp;&nbsp;&nbsp; : expr <st1:personname w:st="on">'</st1:personname>+<st1:personname w:st="on">'</st1:personname> term&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1 + $3; }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | expr <st1:personname w:st="on">'</st1:personname>-<st1:personname w:st="on">'</st1:personname> term&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1 - $3; }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | term&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;<br>&nbsp;<br>term&nbsp;&nbsp;&nbsp; : term <st1:personname w:st="on">'</st1:personname>*<st1:personname w:st="on">'</st1:personname> factor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1 * $3; }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | term <st1:personname w:st="on">'</st1:personname>/<st1:personname w:st="on">'</st1:personname> factor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1 / $3; }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | factor&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;<br>&nbsp;<br>factor&nbsp;&nbsp;&nbsp; : <st1:personname w:st="on">'</st1:personname>(<st1:personname w:st="on">'</st1:personname> expr <st1:personname w:st="on">'</st1:personname>)<st1:personname w:st="on">'</st1:personname>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $2; }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <st1:personname w:st="on">'</st1:personname>(<st1:personname w:st="on">'</st1:personname> expr error&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $2; yyerror("missing <st1:personname w:st="on">'</st1:personname>)<st1:personname w:st="on">'</st1:personname>"); /*yyerrok(); */}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <st1:personname w:st="on">'</st1:personname>-<st1:personname w:st="on">'</st1:personname> factor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = -$2; }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NUMBER&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;<br>&nbsp;<br>%%&nbsp;<br>//以上部分为语法定义，以下部分为函数定义&nbsp;<br>int main(void)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp; return yyparse();&nbsp;<br>}&nbsp;<br>&nbsp;<br>int yylex(void)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp; int c;&nbsp;<br>&nbsp;&nbsp;&nbsp; while ((c = getchar()) == <st1:personname w:st="on">'</st1:personname> <st1:personname w:st="on">'</st1:personname>);&nbsp;<br>&nbsp;&nbsp;&nbsp; if (c == <st1:personname w:st="on">'</st1:personname>.<st1:personname w:st="on">'</st1:personname> || isdigit(c)) {&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ungetc(c, stdin);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%lf", &amp;yylval);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NUMBER;&nbsp;<br>&nbsp;&nbsp;&nbsp; }&nbsp;<br>&nbsp;&nbsp;&nbsp; return c;&nbsp;<br>}&nbsp;<br><br>使用yacc扫描这个文件：<br>yacc yacc_example.y<br>缺省会生成一个y.tab.c文件，然后用gcc编译这个文件，注意要有选项&nbsp;-ll&nbsp;或&nbsp;-ly：<br>gcc y.tab.c -o analyse -ll<br>运行./analyse：结果如下图所示:<br><a href="http://www.linmu100.com/upimg/userup/0709/091P6491532.jpg" target=_blank><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexlinux_FCC3/clip_image001_4.jpg"><img height=313 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexlinux_FCC3/clip_image001_thumb_1.jpg" width=604 border=0 v:shapes="_x0000_i1025"></a></a><br><br>现在对照yacc_example.y文件讲解一下.y文件的规则：<br>1.在全局变量声明部分，声明了一个接口函数yyerror，这个函数是用来在出错时调用的。这一段主要是声明一些变量，数据结构，函数用。<br>2.%token NUMBER则声明了一个终端符(终结符)，这个符号是由Lex返回的，会在yacc语法规则中用到。<br>3.语法规则部分则声明了语法：<br>&nbsp;&nbsp;&nbsp; 3.1语法规则对外只有一个接口，这一点要注意，初学者常常会犯语法对外有多个接口的错误。<br>&nbsp;&nbsp;&nbsp; 3.2无论是lex文件还是yacc文件都要注意最大可能性的词法和语法规则要放在冲突规则的前面，这样保证了最大可能规则会被最先匹配，比如lex文件中：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temperator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return T1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return T2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在yacc文件中，例子如下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; command:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER CHAR<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; NUMBER<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br><br>对于.y文件还要注意全局语法，以及递归的调用。<br><br>初学者对于yacc文件规则可能会较为生疏，关键还要多做一些练习。<br><br><br>Lex 和 Yacc 的结合<br><br>lex和yacc结合时需要注意的是<br>lex文件头要引用yacc生成的头文件:"y.tab.h"<br><br>以下是一个lex和yacc结合的实例：<br>lex_yacc_exp.l文件：<br>%{<br>/*林木100<br>www.linmu100.com<br>*/<br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br>#include "y.tab.h"<br>extern char *yytext;<br>%}<br>%%<br>[0-9]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yylval.number=atoi(yytext); return NUMBER;<br>heater&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TOKHEATER;<br>heat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TOKHEAT;<br>on|off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yylval.number=!strcmp(yytext,"on"); return STATE;<br>target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TOKTARGET;<br>temperature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TOKTEMPERATURE;<br>[a-z0-9]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yylval.string=strdup(yytext);return WORD;<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ignore end of line */;<br>[ \t]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ignore whitespace */;<br>%%<br><br>lex_yacc_exp.y文件:<br>%{<br>/*林木100<br>www.linmu100.com<br>*/<br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br><br>void yyerror(const char *str)<br>{<br>&nbsp;&nbsp;&nbsp; fprintf(stderr,"error: %s\n",str);<br>}<br><br>int yywrap()<br>{<br>&nbsp;&nbsp;&nbsp; return 1;<br>}<br><br>main()<br>{<br>&nbsp;&nbsp;&nbsp; yyparse();<br>}<br><br>char *heater="xl<st1:personname w:st="on">'</st1:personname>s test";<br><br>%}<br><br>%token TOKHEATER TOKHEAT TOKTARGET TOKTEMPERATURE<br><br>%union&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp; int number;<br>&nbsp;&nbsp;&nbsp; char *string;<br>}<br><br>%token &lt;number&gt; STATE<br>%token &lt;number&gt; NUMBER<br>%token &lt;string&gt; WORD<br><br>%%<br><br>commands:<br>&nbsp;&nbsp;&nbsp; | commands command<br>&nbsp;&nbsp;&nbsp; ;<br><br><br>command:<br>&nbsp;&nbsp;&nbsp; heat_switch | target_set | heater_select<br><br>heat_switch:<br>&nbsp;&nbsp;&nbsp; TOKHEAT STATE&nbsp;<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\tHeater <st1:personname w:st="on">'</st1:personname>%s<st1:personname w:st="on">'</st1:personname> turned on\n", heater);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\tHeat <st1:personname w:st="on">'</st1:personname>%s<st1:personname w:st="on">'</st1:personname> turned off\n", heater);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ;<br><br>target_set:<br>&nbsp;&nbsp;&nbsp; TOKTARGET TOKTEMPERATURE NUMBER<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\tHeater <st1:personname w:st="on">'</st1:personname>%s<st1:personname w:st="on">'</st1:personname> temperature set to %d\n",heater, $3);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ;<br><br>heater_select:<br>&nbsp;&nbsp;&nbsp; TOKHEATER WORD<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\tSelected heater <st1:personname w:st="on">'</st1:personname>%s<st1:personname w:st="on">'</st1:personname>\n",$2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; heater=$2;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ;<br><br>输入以下命令，分别生成lex.yy.c，y.tab.c，y.tab.h三个文件：<br>lex lex_yacc_exp.l<br>yacc -d lex_yacc_exp.y<br>gcc lex.yy.c y.tab.c -o analyse -ll<br><br>创建一个语法用例demo，内容如下:<br>heat on<br>target temperature 99<br>heater asdfsieiwef99adsf<br><br>输入./analyse &lt;demo分析demo文件，会得到以下结果:<br><a href="http://www.linmu100.com/upimg/userup/0709/091T6196233.jpg" target=_blank><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexlinux_FCC3/clip_image002_4.jpg"><img height=195 alt=clip_image002 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexlinux_FCC3/clip_image002_thumb_1.jpg" width=604 border=0 v:shapes="_x0000_i1026"></a></a>&nbsp;<br><br><br>结语：<br>Lex 和 Yacc 是很强大的工具，这里只简单介绍了一些入门知识。<br><a href="http://dinosaur.compilertools.net/">The Lex &amp; Yacc Page</a>&nbsp;中有很多有趣的历史参考，以及 非常好的 lex 和 yacc 文档。&nbsp;<br><br>参考文档：<br>http://www.ibm.com/developerworks/cn/linux/l-lexyac.html<br>http://blog.csdn.net/ThinkinginLinux/archive/<st1:chsdate w:st="on" year="2005" month="3" day="19" islunardate="False" isrocdate="False">2005/03/19</st1:chsdate>/323379.aspx<br><br><o:p></o:p></p>
<h2>/<br>/*-----Lex &amp; Yacc ----www.linmu100.com ----*/<br>/<br>/*-----linux工具,Lex &amp; Yacc,基本操作----*/<br>/<br>/*-----linux配置,UNIX,开源软件,linux技术,makefile----*/<br>/<br>/*----------------------@xiaolin--------------------*/<br>/<o:p></o:p></h2>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><o:p>&nbsp;</o:p></p>
</span>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/62293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-19 18:01 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/19/62293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>yacc/lex windows 下 Parser Generator 使用指南</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62292.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 19 Sep 2008 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62292.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/62292.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/19/62292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/62292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/62292.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image001%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=352 alt=clip_image001[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image001%5B7%5D_thumb.jpg" width=504 border=0></a></p>
<p><br>关于yacc 和 lex 和在下面链接的文章里已经有所介绍了<br><a href="http://www.linmu100.com/html/linuxshijie/20070909/80.html">/html/linuxshijie/20070909/80.html</a><br>链接中的文章还介绍了在linux下如何使用yacc和lex工具，下面主要是介绍yacc和lex在windows下的用法。</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yacc和lex在windows已经移植成功，其中常用的一个工具就是Parser Generator。这个工具使用yacc和lex能够生成Visual C++，Borland C++，Other C/C++以及相关Java代码。下面介绍一下这个工具是如何生成代码并使用Visual C++编译的。<br>注：关于Parser Generator的使用和配置，其实在Parser Generator Help中已经有很详细的介绍，感兴趣的朋友可以去那里查到更多有用的信息。<br>首先要去http://www.bumblebeesoftware.com/downloads.htm下载Parser Generator。<br>安装完毕后，我们可以在它的安装目录下找到一些例子以及编译程序所需的库文件和源文件，这些文件在编译是很重要。<br>单独yacc文件的编译。<br><br><br><br><strong style="COLOR: red">以下是一个单独的yacc文件，实现一个简单的计算器功能。</strong><br>%{<br>/************************************************************<br>www.linmu100.com<br>************************************************************/<br>#include &lt;ctype.h&gt;<br>#include &lt;stdio.h&gt;<br>#define YYSTYPE double /* double type for YACC stack */<br>%}<br>%token NUMBER<br>%%<br>lines&nbsp;&nbsp;&nbsp; : lines expr '\n'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { printf("%g\n", $2); }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | lines '\n'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | /* e */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | error '\n'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { yyerror("reenter last line:"); yyerrok(); }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br>expr&nbsp;&nbsp;&nbsp; : expr '+' term&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1 + $3; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | expr '-' term&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1 - $3; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | term<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br>term&nbsp;&nbsp;&nbsp; : term '*' factor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1 * $3; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | term '/' factor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $1 / $3; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | factor<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br>factor&nbsp;&nbsp;&nbsp; : '(' expr ')'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $2; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | '(' expr error&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = $2; yyerror("missing ')'"); yyerrok(); }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | '-' factor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { $$ = -$2; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NUMBER<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br>%%<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; return yyparse();<br>}<br>int yylex(void)<br>{<br>&nbsp;&nbsp;&nbsp; int c;<br>&nbsp;&nbsp;&nbsp; while ((c = getchar()) == ' ');<br>&nbsp;&nbsp;&nbsp; if (c == '.' || isdigit(c)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ungetc(c, stdin);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%lf", &amp;yylval);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NUMBER;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return c;<br>}</p>
<p><br>我们用Parser Generator的Project --&gt; Parser Wizard创建一个工程，如下图所示，注意红圈部分的设置：<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image002%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=clip_image002[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image002%5B7%5D_thumb.jpg" width=445 border=0></a></p>
<p><br>然后设置文件，模板：<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image003%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=clip_image003[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image003%5B7%5D_thumb.jpg" width=445 border=0></a></p>
<p><br>其余按默认完成即可：<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image004%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=clip_image004[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image004%5B7%5D_thumb.jpg" width=445 border=0></a></p>
<p><br>这时，我们可以看到Parser Generator帮我们自动生成了一个myparser.y文件，语法规则就可以在这里加了。<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image005%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=440 alt=clip_image005[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image005%5B7%5D_thumb.jpg" width=604 border=0></a></p>
<p><br>现在我们把开头展示的yacc源码完全覆盖myparser.y文件，然后编译，成功后会生成三个文件：myparser.c，myparser.h，myparser.v<br>好，现在我们要做的就是用vc来编译myparser.c，myparser.h这两个文件了。</p>
<p><br>打开Microsoft Visual C++ 6.0，新建一个工程。<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image006%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=402 alt=clip_image006[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image006%5B7%5D_thumb.jpg" width=604 border=0></a></p>
<p><br>然后将Parser Generator生成的两个文件myparser.c，myparser.h导入工程。（这里就不多说了^-^）<br>现在要设置环境变量了，首先要导入Parser Generator的库文件和源文件。在工具-&gt;选项里要设置这些环境变量。<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image007%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=395 alt=clip_image007[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image007%5B7%5D_thumb.jpg" width=553 border=0></a></p>
<p><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image008%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=395 alt=clip_image008[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image008%5B7%5D_thumb.jpg" width=553 border=0></a></p>
<p><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image009%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=395 alt=clip_image009[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image009%5B7%5D_thumb.jpg" width=553 border=0></a></p>
<p><br>设置完这些文件后，还要在工程-&gt;设置里添加yl.lib库：<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image010%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=409 alt=clip_image010[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image010%5B7%5D_thumb.jpg" width=604 border=0></a></p>
<p><br>好，一切设置完毕，开始编译，编译通过后，就会生成yacc_vc.exe文件。<br>假设有文件demo.txt，此文件和yacc_vc.exe在同一个目录，其内容如下：<br>1+3*5<br>3*4-23<br>7- 9 *30 - 999</p>
<p><br>在此目录的命令行下运行如下命令：yacc_vc.exe &lt;demo.txt，即可得到计算结果：<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image011%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=213 alt=clip_image011[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image011%5B7%5D_thumb.jpg" width=604 border=0></a></p>
<p><br><br><br><span style="COLOR: red"><strong>单独lex文件的编译。</strong></span><br>以下是一个单独的lex文件，实现一个简单的计算单词个数功能。<br>%{<br>/************************************************************<br>www.linmu100.com<br>************************************************************/<br>int wc = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* word count */<br>%}<br>%%<br>[a-zA-Z]+&nbsp;&nbsp;&nbsp; { wc++; }<br>\n|.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { /* gobble up */ }<br>%%<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int n = yylex();<br>&nbsp;&nbsp;&nbsp; return n;<br>}<br>int yywrap(void)<br>{<br>&nbsp;&nbsp;&nbsp; printf("word count: %d\n", wc);<br>&nbsp;&nbsp;&nbsp; return 1;<br>}</p>
<p><br>我们用Parser Generator新建一个工程：<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image012%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=clip_image012[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image012%5B7%5D_thumb.jpg" width=445 border=0></a></p>
<p><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image013%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=clip_image013[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image013%5B7%5D_thumb.jpg" width=445 border=0></a></p>
<p><br>下一步默认完成即可。这时，Parser Generator帮我们自动生成了一个mylexer.l文件，词法规则可以在这里加。<br>同样的，我们用上面展示的lex文件内容完全覆盖mylexer.l文件，编译后同样生成三个文件，然后用VC编译其中的myparser.c，myparser.h这两个文件。<br>VC的设置方法和上面编译单独yacc文件时的步骤完全一样，最终会生成一个可以计算文件单词数目的.exe文件。<br><br><br><br><span style="COLOR: red"><strong>yacc 和 lex整合文件的编译。</strong></span><br>以下分别是yacc文件和lex文件的内容，这两个文件共同实现了自定义的一个简单语法规则。<br>yacc文件内容：<br>%{<br>/*<br>www.linmu100.com<br>*/<br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br>void yyerror(const char *str)<br>{<br>&nbsp;&nbsp;&nbsp; fprintf(stderr,"error: %s\n",str);<br>}<br>int yywrap()<br>{<br>&nbsp;&nbsp;&nbsp; return 1;<br>}<br>main()<br>{<br>&nbsp;&nbsp;&nbsp; yyparse();<br>}<br>char *heater="xl's test";<br>%}<br>%token TOKHEATER TOKHEAT TOKTARGET TOKTEMPERATURE<br>%union <br>{<br>&nbsp;&nbsp;&nbsp; int number;<br>&nbsp;&nbsp;&nbsp; char *string;<br>}<br>%token &lt;number&gt; STATE<br>%token &lt;number&gt; NUMBER<br>%token &lt;string&gt; WORD<br>%%<br>commands:<br>&nbsp;&nbsp;&nbsp; | commands command<br>&nbsp;&nbsp;&nbsp; ;<br>command:<br>&nbsp;&nbsp;&nbsp; heat_switch | target_set | heater_select<br>&nbsp;&nbsp;&nbsp; ;<br>heat_switch:<br>&nbsp;&nbsp;&nbsp; TOKHEAT STATE <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\tHeater '%s' turned on\n", heater);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\tHeat '%s' turned off\n", heater);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ;<br>target_set:<br>&nbsp;&nbsp;&nbsp; TOKTARGET TOKTEMPERATURE NUMBER<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\tHeater '%s' temperature set to %d\n",heater, $3);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ;<br>heater_select:<br>&nbsp;&nbsp;&nbsp; TOKHEATER WORD<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\tSelected heater '%s'\n",$2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; heater=$2;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ;<br>lex文件内容：<br>%{<br>/*<br>www.linmu100.com<br>*/<br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br>#include "myparser.h"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //注意，这里的头文件要和Parser Generator生成的头文件名一样。<br>extern char *yytext;<br>%}<br>%%<br>[0-9]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {yylval.number=atoi(yytext); return NUMBER;}<br>heater&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TOKHEATER;<br>heat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TOKHEAT;<br>on|off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {yylval.number=!strcmp(yytext,"on"); return STATE;}<br>target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TOKTARGET;<br>temperature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TOKTEMPERATURE;<br>[a-z0-9]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {yylval.string=strdup(yytext);return WORD;}<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ignore end of line */;<br>[ \t]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ignore whitespace */;<br>%%<br>现在用Parser Generator创建新的工程：<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image014%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=clip_image014[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image014%5B7%5D_thumb.jpg" width=445 border=0></a></p>
<p><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image015%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=clip_image015[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image015%5B7%5D_thumb.jpg" width=445 border=0></a></p>
<p><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image016%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=clip_image016[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image016%5B7%5D_thumb.jpg" width=445 border=0></a></p>
<p><br>其余的步骤和上面编译yacc时的步骤相同，最终可以生成both_y_l.exe文件，放一个demo.txt和both_y_l.exe在同一个目录下，demo.txt内容如下：<br>heat on<br>target temperature 99<br>heater asdfsieiwef99adsf</p>
<p><br>然后在此目录的命令行下执行both_y_l.exe &lt;demo.txt得到：<br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image017%5B7%5D.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=270 alt=clip_image017[7] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/yacclexwindowsParserGenerator_FB8B/clip_image017%5B7%5D_thumb.jpg" width=604 border=0></a></p>
<p><br>以上即为Parser Generator的使用以及如何用VC编译。<br>/<br>/*-----Lex &amp; Yacc ----<a href="http://www.linmu100.com/html/linuxshijie/20070917/84.html">www.linmu100.com</a> ----*/<br>/<br>/*-----linux工具,Lex &amp; Yacc,windows下操作----*/<br>/<br>/*-----linux配置,UNIX,开源软件,linux技术,makefile----*/<br>/<br>/*----------------------@xiaolin--------------------*/</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/62292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-19 17:54 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/19/62292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc++与YACC和LEX集成环境</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50118.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 16 May 2008 16:33:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50118.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/50118.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/50118.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/50118.html</trackback:ping><description><![CDATA[<p>在这里，将介绍由英国Bumble-Bee Software公司生产的Windows环境下的YACC和LEX集成环境Parser Generator。Parser Generator是Windows下YACC和LEX的实现。它包括一个图形用户界面，同时包括YACC和Lex两个版本，分别叫做AYACC和Alex。Parser Generator非常适合于与VC++集成。
<p>在安装了Parser Generator后，执行以下步骤，即可使VC++编译和连接由Parser Generator产生的文件。
<p>1．目录设置
<p>在VC++中执行以下步骤，每个步骤只执行一次。
<p>（1） 选择Tools菜单中的Options命令，在屏幕上即会出现Options对话框。
<p>（2） 选择Directories选项卡。
<p>（3） 在Show Directories for下拉列表框中选择Include Files。
<p>（4） 在Directories框中，点击最后的空目录，并填入Parser Generator的include子目录的路径。
<p>（5） 在Show Directories for下拉列表框中选择Library Files。
<p>（6） 在Directories框中，点击最后的空目录，并填入Parser Generator的lib\msdev子目录的路径。
<p>（7） 在Show Directories for下拉列表框中选择Source Files。
<p>（8） 在Directories框中，点击最后的空目录，并填入Parser Generator的Source子目录的路径。
<p>（9） 点击OK按钮,Options对话框将接受设置并关闭。
<p>VC++在就可以找到包含文件yacc.h和lex.h以及YACC和Lex的库文件。
<p>2．项目设置
<p>对于每个VC++项目，都需在VC++中执行以下步骤：
<p>（1） 选择Project菜单中的Settings命令，在屏幕上即会出现Project Settings对话框。
<p>（2） 在Settings for下拉列表框中选择Win32 Debug。
<p>（3） 选择C/C++标签。
<p>（4） 在Category下拉列表框中选择General。
<p>（5） 在Preprocessor Definitions框中，在当前文本的最后，输入YYDEBUG。
<p>（6） 选择Link标签。
<p>（7） 在Category下拉列表框中选择General。
<p>（8） 在Object/Library Modules框中，在当前文本的后面，输入yld.lib ylmtd.lib ylmtdlld.lib。
<p>（9） 在Settings for下拉列表框中选择Win32 Release。
<p>（10） 重复第8步的工作。
<p>（11） 点击OK按钮，Project Settings对话框将接受设置并关闭。
<p>VC++现在可以从特定的库中接受YACC和Lex所需的函数和变量。
<p>3．应用
<p>（1）在Parser Generator下的编辑窗口输入YACC源程序（扩展名必须为.y）。
<p>（2）用Parser Generator下的Project菜单的Compile file命令编译源程序，生成相应的C语言源程序（.cpp）。
<p>（3）用VC++编译，连接C语言源程序，生成可执行程序（.exe）后即可执行。
<p>用的VC 2005, 和原来VC 6的设置项对应不上, 很多半天都找不到.好不容易找全了, 却还是编译出错.<br>最后,只好选择再装一个VC6, 嗯, 两个VC, 不错.<br>先介绍一下Parser Generator,主页下载:<a href="http://www.bumblebeesoftware.com/downloads.htm">http://www.bumblebeesoftware.com/downloads.htm</a><br>Parser Generator is<strong> a YACC and Lex programming</strong> tool for Windows. As well as including a Graphical User Interace, the software also includes two versions of YACC and Lex, called AYACC and ALex. Parser Generator is able to generate C, C++ and Java parsers and lexical analysers. This includes both Unicode and Multibyte Character Set (MBCS) variants. In your applications you can create multiple, thread safe, instances of these parsers and lexical analysers.
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面说一下windows环境下parser generator和vc++的各项配置
<p>（一）parser generator的环境设置
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装好parser generator，打开集成开发环境，点项目Project菜单，在下拉菜单中选LibBuilder，弹出LibBuilder对话框选择属性按钮，弹出compiler properties 对话框： <br>&nbsp;&nbsp; Name 选择Visual C++ (32-bit)
<p>&nbsp;&nbsp; Directory :msvc32<br>&nbsp;&nbsp; options:
<p>依次为 vc++版本(Versoin 6)<br>是否支持unicode码。(选择默认)<br>是否把w_char_t作为内建类型。(选择默认)<br>下边是VC的各种目录：<br>依次为<br>Compiler Bin Directory (C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\BIN
<p>Compiler Bin Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\COMMON\MSDEV98\BIN
<p>Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\INCLUDE
<p>Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\INCLUDE
<p>Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\LIB
<p>Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\LIB
<p>&nbsp;&nbsp;&nbsp; 注意：编译器安装目录根据个人安装目录需要做相应的调整。所有的这些设置完成之后点ok。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后一步,配置parser generator的properties,如图即可:<br><img src="http://www.cppblog.com/images/cppblog_com/pengkuny/parsergenerator.gif" border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回LibBuilder。点Build就可以编译vc++使用的lex与yacc的lib库。
<p><strong>注:我参考Vs 2003.net的设置,在VC 2005下进行相应设置, 结果lex与yacc的lib库没能编译通过, 可能是我设置错误, 不应该是尚不兼容的问题吧. </strong><br>&nbsp;&nbsp;&nbsp; 生成库文件在软件安装目录下的D:\Parser Generator 2\Cpp\Lib\msvc32目录下。
<p>（二）vc++环境的设置
<p>1.目录设置
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了在VC++中可以找到包含文件yacc.h和lex.h以及YACC和Lex的库文件，需要对VC++进行相关的目录设置<br>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择Tools菜单中的Options命令，打开Options对话框。<br>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择Directories选项卡。<br>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Show Directories for下拉列表框中选择Include Files。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Directories框中，点击最后的空目录，并填入 F:\PARGEN\CPP\INCLUDE(根据个人安装目录需要做相应的调整)<br>（4）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Show Directories for下拉列表框中选择Library Files。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Directories框中，点击最后的空目录，并填入F:\PARGEN\CPP\LIB\MSVC32<br>（5）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Show Directories for下拉列表框中选择Source Files。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Directories框中，点击最后的空目录，并填入F:\PARGEN\CPP\SOURCE<br>（6）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击OK按钮,Options对话框将接受设置并关闭。
<p>2．项目设置<br><strong>对于每个VC++项目，都需在VC++中进行以下设置</strong>，以使VC++可以从特定的库中接受LEX和YACC所需要的函数和变量<br>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择Project菜单中的Settings命令，打开Project Settings对话框。<br>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Settings for下拉列表框中选择Win32 Debug。<br>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择C/C++选项卡， 在Category下拉列表框中选择General。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Preprocessor Definitions框中，在当前文本的最后，输入 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，YYDEBUG<br><strong>注:对应到VC 2005为C/C++-&gt;Preprocessor-&gt;Preprocessor Definitions.</strong><br>（4）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择Link选项卡，在Category下拉列表框中选择General。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Object/Library Modules框中，在当前文本的后面，输入yld.lib<br><strong>注:VC 6中的Object/Library Modules对应到VC 2005为Propert-&gt;Configuration Properties-&gt;Linker-&gt;Input-&gt;Additional Dependencies ,找了好久.<img height=20 src="http://www.cppblog.com/Emoticons/QQ/17.gif" width=20 border=0></strong><br>（5）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Settings for下拉列表框中选择Win32 Release。<br>（6）&nbsp;&nbsp;&nbsp;&nbsp; 重复第4步的工作。<br>（7）&nbsp;&nbsp; 点击OK按钮，Project Settings对话框设置完毕。
<p>&nbsp;&nbsp; 这样设置之后我们就可以用vc++编译Parser Generator 生成的c文件了。具体为：<br>先打开Parser Generator 集成开发环境。点击Project菜单，点击下拉菜单中的ParseWizard菜单，一路下去建立一个工程。然后点击project菜单下的的Rebuild All。在项目文件夹下就生成了相应c文件与h文件。<br>再用VC++建立一个空控制台工程，然后把用用Parser Generator <br>生成的c文件和头文件加入工程中。接着对VC++进行上面所说的项目设置，然后就可以编译运行了。新手可以使用parser generator 自带的范例，这样方便检验环境的配置是否正确.</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/50118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-17 00:33 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/17/50118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Yacc &amp;amp; Lex</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50117.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 16 May 2008 16:20:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50117.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/50117.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/50117.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/50117.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<p>yacc(Yet Another Compiler Compiler)，是Unix/Linux上一个用来生成编译器的编译器（编译器代码生成器）。yacc生成的编译器主要是用C语言写成的语法解析器（Parser），需要与词法解析器Lex一起使用，再把两部份产生出来的C程序一并编译。yacc本来只在Unix系统上才有，但现时已普遍移植往Windows及其他平台。<br>分析程序生成器(parser generator)是一个指定某个格式中的一种语言的语法作为它的输入，并为该种语言产生分析过程以作为它的输出的程序。在历史上，分析程序生成器被称作编译-编译程序( compiler- compiler )，这是由于按照规律可将所有的编译步骤作为包含在分析程序中的动作来执行。现在的观点是将分析程序仅考虑为编译处理的一个部分，所以这个术语也就有些过时了。合并 LALR(1) 分析算法是一种常用的分析生成器，它被称作 Yacc( yet another compiler- compiler )。给出 Yacc 的概貌来，将使用Yacc为 TINY 语言开发一个分析程序。<br>作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身，而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。<br>yacc的输入是巴科斯范式（BNF）表达的语法规则以及语法规约的处理代码，Yacc输出的是基于表驱动的编译器，包含输入的语法规约的处理代码部分。<br>yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。<br>Yacc最初由AT&amp;T的Steven C. Johnson为Unix操作系统开发，后来一些兼容的程序如Berkeley Yacc，GNU bison，MKS yacc和Abraxas yacc陆续出现。它们都在原先基础上做了少许改进或者增加，但是基本概念是相同的。<br>由于所产生的解析器需要词法分析器配合，因此Yacc经常和词法分析器的产生器——一般就是Lex——联合使用。IEEE POSIX P1003.2 标准定义了Lex和Yacc的功能和需求。<br><a href="http://dickey.his.com/byacc/byacc.html">http://dickey.his.com/byacc/byacc.html</a> Berkeley Yacc 一般认为是目前最好的yacc变种。与bison相比，避免了对特定编译器的依赖。<br><a href="http://www.informatik.uni-freiburg.de/proglang/software/essence/">http://www.informatik.uni-freiburg.de/proglang/software/essence/</a> Essence，Scheme的LR(1)语法解析器的生成器<br><a href="http://download.plt-scheme.org/scheme/plt/collects/parser-tools/">http://download.plt-scheme.org/scheme/plt/collects/parser-tools/</a> 用于DrScheme的语法解析工具<br><a href="http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/">http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/</a> Coco/R Java和C#的扫描和解析器<br><a href="http://mhss.nease.net/unix/yacc.html">http://mhss.nease.net/unix/yacc.html</a> Yacc: 另一个编译器的编译器,Stephen C. Johnson&nbsp;&nbsp;
<p>&nbsp;</p>
<p><strong><em><font size=5>IBM的快速入门</font></em></strong></p>
<p><a title=http://www.ibm.com/developerworks/cn/linux/sdk/lex/ href="http://www.ibm.com/developerworks/cn/linux/sdk/lex/"><strong><em><font size=5>http://www.ibm.com/developerworks/cn/linux/sdk/lex/</font></em></strong></a></p>
<p>&nbsp;</p>
<p><strong><em>windows下的lex与yacc工具</em></strong></p>
<p>只所以推荐它是因为它生成的c文件可以在vc++下通过编译。<br>&nbsp;&nbsp;&nbsp;&nbsp; 下载地址 <a href="http://www.bumblebeesoftware.com/downloads.htm">http://www.bumblebeesoftware.com/downloads.htm</a><br>下载之后，解压缩，然后安装。打开集成开发环境，点项目Project菜单，在下拉菜单中选LibBuilder，弹出LibBuilder对话框选择属性按钮<br>弹出compiler properties 对话框，<br>Name 选择Visual C++ (32-bit)<br>Directory :msvc32<br>options:<br>依次为<br>vc++版本(Versoin 7(.net))。<br>是否支持unicode码。<br>是否把w_char_t作为内建类型。<br>下边是VC的各种目录：<br>依次为<br>Compiler Bin Directory (C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\BIN)<br>Compiler Bin Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\COMMON7\IDE)<br>Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\INCLUDE)<br>Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\PLATFORMSDK\INCLUDE)<br>Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\LIB)<br>Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\PLATFORMSDK\LIB)<br>注意：括号里边的是我自己编译器安装目录，也许你的和我的不一样，需要做相应的调整。<br>所有的这些设置完成之后点ok。返回LibBuilder。点Build就可以编译vc++使用的lex与yacc的lib库。生成库文件在软件安装目录下的D:\Parser Generator 2\Cpp\Lib\msvc32目录下。<br>然后我们我们在vc++环境设置中增加包含文件目录D:\Parser Generator 2\Cpp\Include<br>lib库目录D:\Parser Generator 2\Cpp\Lib\msvc32<br>具体设置<br>打开VC++.net集成开发环境。<br>点工具菜单<br>下拉菜单中点选项菜单。<br>弹出框中点左边列表框中的projects，然后点击vc++目录<br>在显示以下内容目录标签下的列表框中&#8220;选包含目录&#8221;进行设置，选&#8220;库文件&#8221;进行设置。<br>具体设置就是点击列表框下边五个按钮中的第二个按钮，就加入一行，当选择&#8220;包含目录&#8221;的时候填入D:\Parser Generator 2\Cpp\Include，当选择&#8220;库文件&#8221;的时候填入D:\Parser Generator 2\Cpp\Lib\msvc32，也可以点右边的浏览按钮进行选择。<br>这样设置之后我们就可以用vc++编译用Parser Generator 2生成的c文件。具体为<br>打开Parser Generator 2集成开发环境。<br>点击Project菜单，点击下拉菜单中的ParseWizard菜单，一路下去建立一个工程。然后点击project菜单下的的Rebuild All。在项目文件夹下就生成了相应c文件与h文件。<br>用VC++建立一个空控制台工程，然后把用用Parser Generator 2生成的c文件加入工程中。最后引入响应的库文件，就是我们在D:\Parser Generator 2\Cpp\Lib\msvc32目录下生成的lex与yacc库文件。接着编译，如果成功，那么万事大吉。 </p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/50117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-17 00:20 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/17/50117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的词法分析器</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50114.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 16 May 2008 16:09:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50114.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/50114.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/17/50114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/50114.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/50114.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<div id=csdnblog_allwrap>
<form language=javascript id=Form1 name=Form1 action=http://blog.csdn.net/591275.aspx method=post>
    <div id=csdnblog_midwrap>
    <div id=csdnblog_content>
    <div class=gutter>
    <div class=default_contents>
    <div class=user_article>
    <div class=blogstory>
    <p>[lexical_analyzer.h]<br><br>#ifndef LEXICAL_ANALYZER_H<br>#define LEXICAL_ANALYZER_H<br><br>enum lexical_status<br>{<br>&nbsp;&nbsp;&nbsp; status_success,<br>&nbsp;&nbsp;&nbsp; status_eof,<br>&nbsp;&nbsp;&nbsp; status_invalid_char,<br>&nbsp;&nbsp;&nbsp; status_unknown = -1,<br>};<br><br>enum token_category<br>{<br>&nbsp;&nbsp;&nbsp; token_error,<br>&nbsp;&nbsp;&nbsp; token_keyword,<br>&nbsp;&nbsp;&nbsp; token_identifier,<br>&nbsp;&nbsp;&nbsp; token_number,<br>&nbsp;&nbsp;&nbsp; token_char,<br>&nbsp;&nbsp;&nbsp; token_string,<br>&nbsp;&nbsp;&nbsp; token_operator,<br>&nbsp;&nbsp;&nbsp; token_punctuator,<br>};<br><br>struct token<br>{<br><br>&nbsp;&nbsp;&nbsp; token_category category;<br>&nbsp;&nbsp;&nbsp; std::string value;<br>};<br><br>class lexical_analyzer<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; explicit lexical_analyzer(std::istream&amp; ifs);<br>&nbsp;&nbsp;&nbsp; lexical_status get_token(token&amp; t);<br>&nbsp;&nbsp;&nbsp; int current_line() const;<br>private:<br>&nbsp;&nbsp;&nbsp; bool filter_space();<br>&nbsp;&nbsp;&nbsp; bool filter_comment();<br>&nbsp;&nbsp;&nbsp; std::string get_hex_string();<br>&nbsp;&nbsp;&nbsp; std::string get_digital_string();<br>&nbsp;&nbsp;&nbsp; std::string get_string(char delimiter);<br>&nbsp;&nbsp;&nbsp; bool is_keyword(const std::string&amp; str);<br>&nbsp;&nbsp;&nbsp; int get_char();<br>&nbsp;&nbsp;&nbsp; int peek_char();<br>&nbsp;&nbsp;&nbsp; void putback(char ch);<br>&nbsp;&nbsp;&nbsp; void skip_char();<br>private:<br>&nbsp;&nbsp;&nbsp; std::istream* m_pstream;<br>&nbsp;&nbsp;&nbsp; int m_line;<br>};<br><br>inline lexical_analyzer::lexical_analyzer(std::istream&amp; ifs) <br>&nbsp;&nbsp;&nbsp; :m_pstream(&amp;ifs), m_line(1)<br>{<br>}<br><br>inline int lexical_analyzer::current_line() const<br>{<br>&nbsp;&nbsp;&nbsp; return m_line;<br>}<br><br>inline int lexical_analyzer::peek_char()<br>{<br>&nbsp;&nbsp;&nbsp; return m_pstream-&gt;peek();<br>}<br><br>inline void lexical_analyzer::skip_char()<br>{<br>&nbsp;&nbsp;&nbsp; get_char();<br>}<br><br>#endif//LEXICAL_ANALYZER_H<br><br><br><br><br>[lexical_analyzer.cpp]<br><br><br>#include &lt;fstream&gt;<br>#include "lexical_analyzer.h"<br><br>int lexical_analyzer::get_char()<br>{<br>&nbsp;&nbsp;&nbsp; int ch = m_pstream-&gt;get();<br>&nbsp;&nbsp;&nbsp; if (ch=='\n')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++m_line;<br>&nbsp;&nbsp;&nbsp; return ch;<br>}<br><br>void lexical_analyzer::putback(char ch)<br>{<br>&nbsp;&nbsp;&nbsp; if (ch=='\n')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --m_line;<br>&nbsp;&nbsp;&nbsp; m_pstream-&gt;putback(ch);<br>}<br><br>bool lexical_analyzer::filter_space()<br>{<br>&nbsp;&nbsp;&nbsp; bool result = false;<br>&nbsp;&nbsp;&nbsp; char ch = peek_char();<br>&nbsp;&nbsp;&nbsp; if (isspace(ch))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = peek_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (isspace(ch));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br>bool lexical_analyzer::filter_comment()<br>{<br>&nbsp;&nbsp;&nbsp; if(peek_char()=='/')<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ch = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch=='/')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(peek_char()!='\n')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='*')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(;;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(get_char()=='*' &amp;&amp; get_char()=='/')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putback('/');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>bool lexical_analyzer::is_keyword(const std::string&amp; str)<br>{<br>&nbsp;&nbsp;&nbsp; static const char* const keywords[]=<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "asm",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "auto",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "bad_cast",&nbsp;&nbsp;&nbsp;&nbsp; "bad_typeid", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "bool",&nbsp;&nbsp;&nbsp;&nbsp; "break",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "case",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "catch", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "char",&nbsp;&nbsp;&nbsp;&nbsp; "class",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "const",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "const_cast", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "continue", "default",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "delete",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "do", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "double",&nbsp;&nbsp; "dynamic_cast", "else",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "enum", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "except",&nbsp;&nbsp; "explicit",&nbsp;&nbsp;&nbsp;&nbsp; "extern",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "false", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "finally",&nbsp; "float",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "for",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "friend", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "goto",&nbsp;&nbsp;&nbsp;&nbsp; "if",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "inline",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "int", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "long",&nbsp;&nbsp;&nbsp;&nbsp; "mutable",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "namespace",&nbsp;&nbsp;&nbsp; "new", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "operator", "private",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "protected",&nbsp;&nbsp;&nbsp; "public", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "register", "reinterpret_cast",&nbsp;&nbsp;&nbsp;&nbsp; "return",&nbsp;&nbsp; "short", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "signed",&nbsp;&nbsp; "sizeof",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "static",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "static_cast", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "struct",&nbsp;&nbsp; "switch",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "template",&nbsp;&nbsp;&nbsp;&nbsp; "this", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "throw",&nbsp;&nbsp;&nbsp; "true",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "try",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "typedef",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "typeid",&nbsp;&nbsp; "typename",&nbsp;&nbsp;&nbsp;&nbsp; "union",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "unsigned",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "using",&nbsp;&nbsp;&nbsp; "virtual",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "void",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "volatile", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "while",&nbsp; <br>&nbsp;&nbsp;&nbsp; };<br><br>&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;sizeof(keywords)/sizeof(keywords[0]); i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(str.compare(keywords[i])==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br>std::string lexical_analyzer::get_string(char delimiter)<br>{<br>&nbsp;&nbsp;&nbsp; std::string result;<br>&nbsp;&nbsp;&nbsp; for(;;)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ch = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch==delimiter)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='\\')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(ch)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\"':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\"';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\'':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\'';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'r':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\r';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'n':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\n';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'v':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\v';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 't':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\t';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'a':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\a';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'b':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\b';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'f':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = '\f';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\r':&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // line splice<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\n':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch=='x' || ch=='X')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string s = get_hex_string();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;s.length(); i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x *= 16;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(s[i]&gt;='A' &amp;&amp; s[i]&lt;='F')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x += s[i]-'A' + 10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(s[i]&gt;='a' &amp;&amp; s[i]&lt;='f')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x += s[i]-'a' + 10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x += s[i]-'0';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = (char)x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += ch;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return result;<br>}<br><br>std::string lexical_analyzer::get_digital_string()<br>{<br>&nbsp;&nbsp;&nbsp; std::string result;<br>&nbsp;&nbsp;&nbsp; char ch;<br>&nbsp;&nbsp;&nbsp; while(isdigit(ch=get_char()))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += ch;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; putback(ch);<br><br>&nbsp;&nbsp;&nbsp; return result;<br>}<br><br>std::string lexical_analyzer::get_hex_string()<br>{<br>&nbsp;&nbsp;&nbsp; std::string result;<br>&nbsp;&nbsp;&nbsp; char ch;<br>&nbsp;&nbsp;&nbsp; while(isxdigit(ch=get_char()))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += ch;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; putback(ch);<br><br>&nbsp;&nbsp;&nbsp; return result;<br>}<br><br>lexical_status lexical_analyzer::get_token(token&amp; t)<br>{<br>&nbsp;&nbsp;&nbsp; if(m_pstream-&gt;eof())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return status_eof;<br><br><br>&nbsp;&nbsp;&nbsp; while(filter_space() || filter_comment())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; while(filter_comment() || filter_space())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if(m_pstream-&gt;eof())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return status_eof;<br><br>&nbsp;&nbsp;&nbsp; t.value.resize(0);<br><br>&nbsp;&nbsp;&nbsp; char ch = get_char();<br>&nbsp;&nbsp;&nbsp; if(ch=='_' || isalpha(ch) || isdigit(ch) || ch=='$')<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_identifier;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }while(ch=='_' || isalpha(ch) || isdigit(ch) || ch=='$');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putback(ch);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if(isdigit(ch))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_number;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch=='x' || ch=='X')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += get_hex_string();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(isdigit(ch))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += get_digital_string();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if(ch=='\"')<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_string;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = get_string('\"');<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if(ch=='\'')<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_char;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = get_string('\'');<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_operator;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch=='=' || ch=='&amp;' || ch=='|' || ch==':')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(peek_char()==ch)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='+' || ch=='-')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cc = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cc==ch)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(cc=='=')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += '=';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='-' &amp;&amp; cc=='&gt;')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += '&gt;';&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc = peek_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cc=='*')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip_char();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += '*';&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putback(cc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='*' || ch=='/' || ch=='%' || ch=='^' || ch=='!')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = peek_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch=='=')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value+='=';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='&lt;' || ch=='&gt;')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cc = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch==cc)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &lt;&lt; &gt;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += cc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc = peek_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cc=='=')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &lt;&lt;= &gt;&gt;=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += '=';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(cc=='=')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += '=';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putback(cc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='.')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = '.';&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch=='*')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += '*';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // .*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='.')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cc = get_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cc=='.')&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value += "..";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putback(cc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putback(ch);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putback(ch);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='~' || ch =='?' ||<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch=='[' || ch==']' ||<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch=='(' || ch==')'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch==';' || ch=='{'|| ch=='}'|| ch==','|| ch=='#' )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_punctuator;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(ch=='\\')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = peek_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch=='\r' || ch=='\n')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip_char();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_error;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_error;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.value = ch;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return status_invalid_char;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if(t.category == token_identifier &amp;&amp; is_keyword(t.value))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.category = token_keyword;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return status_success;<br>}<br><br><br><br>[main.c], 测试程序<br>#include &lt;fstream&gt;<br>#include &lt;string&gt;<br>#include &lt;iostream&gt;<br><br>#include "lexical_analyzer.h"<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; std::ifstream ifs("D:\\ThreadFuncs.cpp", std::ios::in | std::ios::binary);<br>&nbsp;&nbsp;&nbsp; lexical_analyzer lex(std::cin);<br>&nbsp;&nbsp;&nbsp; //lexical_analyzer lex(ifs);<br>&nbsp;&nbsp;&nbsp; std::ofstream ofs("D:\\out.cpp");<br>&nbsp;&nbsp;&nbsp; //std::ostream&amp; os = ofs;<br>&nbsp;&nbsp;&nbsp; std::ostream&amp; os = std::cout;<br>&nbsp;&nbsp;&nbsp; token t;<br>&nbsp;&nbsp;&nbsp; lexical_status status;<br>&nbsp;&nbsp;&nbsp; while((status=lex.get_token(t))!=status_eof)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(status==status_success)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os &lt;&lt; t.value &lt;&lt; '\n';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(status==status_invalid_char)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Line:" &lt;&lt; lex.current_line() &lt;&lt; "invalid_char: " &lt;&lt; t.value &lt;&lt; '\n';<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
</form>
</div>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/50114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-17 00:09 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/17/50114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>