⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.htm

📁 C#版词法分析程序
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>http</title>
</head>

<body>

<p><a href="http://www.cnblogs.com/tonyqus/archive/2005/04/19/140266.html">
http://www.cnblogs.com/tonyqus/archive/2005/04/19/140266.html</a></p>
<p><b><span lang="zh-cn">概要<br>
</span></b><br>
根据词法分析模块中的有限状态机设计的词法分析器,能够对有效状态集中的词进行分解,如果出现了不在状态集中词或符号,则会报错。具体有哪些词受到支持,参看以下介绍。<br>
<br>
测试范例: <br>
1. 1.0+2*3= <br>
2. 1.0+(2*3+cos3)/3.6-6= <br>
3. tg(1.0+(sin2*3+cos3)/3.6-6)= <br>
4. 4.0log(1.0+(sin2*3+cos3)/3.6-6)= <br>
5. 自己想吧... <br>
<br>
<b>使用注意事项</b><br>
1. 该程序在VS.net 2003+.Net 1.1 sp1环境下调试通过 <br>
2. 考虑到可能在之后的设计中加入新的字母串支持,暂时对于所有的字母串都能识别,因此如果你发现一些不受支持的字母串也会被分解出来,请不要感到奇怪 <br>
3. 表达式的最后一个项是不识别的,建议在表达式最后加上'='或'#' <br>
4. 结果字符串中的数字是对应于特定的Phrase的<br>
5. 负号用<a href="mailto:'@'">'@'</a>表示,如-4应写成@4</p>
<p><strong>词法分析模块的功能</strong> <br>
  负责对用户输入的表达式进行分词处理,把每一个合法符号(包括数)存入一个特定的存储结构中,能够供之后的文法分析模块和计算模块使用,如果发现非法符号马上停止处理,报错。 
<br>
<br>
<strong>合法符号表</strong> <br>
第一个版本支持的合法符号列表如下: <br>
 </p>
<table style="width: 466px; border-collapse: collapse; height: 346px" cellSpacing="0" cellPadding="3" border="1">
  <tr>
    <td>&nbsp;符号</td>
    <td>&nbsp;类型编号</td>
    <td>分类自定义名称</td>
  </tr>
  <tr>
    <td>ln</td>
    <td>1 </td>
    <td>ln</td>
  </tr>
  <tr>
    <td>lg</td>
    <td>2 </td>
    <td>lg</td>
  </tr>
  <tr>
    <td>log</td>
    <td>3</td>
    <td>log</td>
  </tr>
  <tr>
    <td>^</td>
    <td>4</td>
    <td>pow</td>
  </tr>
  <tr>
    <td>Cbrt</td>
    <td>6</td>
    <td>cbrt</td>
  </tr>
  <tr>
    <td>Sbrt</td>
    <td>7</td>
    <td>sbrt</td>
  </tr>
  <tr>
    <td>!</td>
    <td>8</td>
    <td>fact</td>
  </tr>
  <tr>
    <td>sin</td>
    <td>10</td>
    <td>sin</td>
  </tr>
  <tr>
    <td>cos</td>
    <td>11</td>
    <td>cos</td>
  </tr>
  <tr>
    <td>asin</td>
    <td>12</td>
    <td>asin</td>
  </tr>
  <tr>
    <td>acos</td>
    <td>13</td>
    <td>acos</td>
  </tr>
  <tr>
    <td>tg</td>
    <td>14</td>
    <td>tg</td>
  </tr>
  <tr>
    <td>ctg</td>
    <td>15</td>
    <td>ctg</td>
  </tr>
  <tr>
    <td>atg</td>
    <td>16</td>
    <td>atg</td>
  </tr>
  <tr>
    <td>actg</td>
    <td>17</td>
    <td>actg</td>
  </tr>
  <tr>
    <td>+</td>
    <td>18</td>
    <td>plus</td>
  </tr>
  <tr>
    <td>-</td>
    <td>19</td>
    <td>minus</td>
  </tr>
  <tr>
    <td>*</td>
    <td>20</td>
    <td>mutiple</td>
  </tr>
  <tr>
    <td>/</td>
    <td>21</td>
    <td>divide</td>
  </tr>
  <tr>
    <td>%</td>
    <td>23</td>
    <td>mod</td>
  </tr>
  <tr>
    <td>(</td>
    <td>24</td>
    <td>leftbracket</td>
  </tr>
  <tr>
    <td>)</td>
    <td>25</td>
    <td>rightbracket</td>
  </tr>
  <tr>
    <td>ANS</td>
    <td>26</td>
    <td>ans</td>
  </tr>
  <tr>
    <td>STO</td>
    <td>27</td>
    <td>sto</td>
  </tr>
  <tr>
    <td>CLR</td>
    <td>28</td>
    <td>clr</td>
  </tr>
  <tr>
    <td>AX</td>
    <td>29</td>
    <td>ax</td>
  </tr>
  <tr>
    <td>BX</td>
    <td>30</td>
    <td>bx</td>
  </tr>
  <tr>
    <td>CX</td>
    <td>31</td>
    <td>cx</td>
  </tr>
  <tr>
    <td>DX</td>
    <td>32</td>
    <td>dx</td>
  </tr>
  <tr>
    <td>EX</td>
    <td>33</td>
    <td>ex</td>
  </tr>
  <tr>
    <td>FX</td>
    <td>34</td>
    <td>fx</td>
  </tr>
  <tr>
    <td>e</td>
    <td>35</td>
    <td>e</td>
  </tr>
  <tr>
    <td>PI</td>
    <td>36</td>
    <td>pi</td>
  </tr>
  <tr>
    <td>浮点数</td>
    <td>37</td>
    <td>number</td>
  </tr>
  <tr>
    <td>#</td>
    <td>38</td>
    <td>sharp</td>
  </tr>
</table>
<p><br>
<strong>分析策略</strong> <br>
采用有限自动机(DFA)进行分析,对于特定符号如+、-、*、/、%、(、)、!、^、=,为每一个符号提供一个状态、而其他的一些由字母组成的符号,如ans、pi、sto、clr等,则作为是一个词,之后再对词进行分类处理。 
<br>
具体的DFA状态图如下: <br>
<img src="dgm4255d8f502ec.jpg" width="610" height="698">&nbsp; <br>
<u>注</u>: <br>
1. 图中每一个箭头表明一个字符的输入,由于这个输入,自动机从一个状态变为另一个状态 <br>
2. 图中的负号和减号是两个完全不同的符号,大家不要根据常识认为是一样的,其实在实现时是用<a href="mailto:'@'">'@'</a>代负号的 
<br>
各状态的说明如下 <br>
 </p>
<table style="width: 414px; border-collapse: collapse; height: 456px" cellSpacing="0" cellPadding="3" border="1">
  <tr>
    <td>&nbsp;状态</td>
    <td>说明 </td>
    <td>对应符号分类名称 </td>
  </tr>
  <tr>
    <td>S0</td>
    <td>初态</td>
    <td> </td>
  </tr>
  <tr>
    <td>S1</td>
    <td>整数串</td>
    <td> </td>
  </tr>
  <tr>
    <td>S2</td>
    <td>浮点数串</td>
    <td>number</td>
  </tr>
  <tr>
    <td>S3</td>
    <td>字母串</td>
    <td>ln、lg、log <br>
    cos、sin、tg、ctg <br>
    acos、asin、atg、actg <br>
    cbrt、sbrt、ans、sto、 <br>
    ax、bx、cx、dx、ex、fx <br>
    pi、e </td>
  </tr>
  <tr>
    <td>S4</td>
    <td>+</td>
    <td>plus</td>
  </tr>
  <tr>
    <td>S5</td>
    <td>-</td>
    <td>minus</td>
  </tr>
  <tr>
    <td>S6</td>
    <td>*</td>
    <td>mutiple</td>
  </tr>
  <tr>
    <td>S7</td>
    <td>/</td>
    <td>divide</td>
  </tr>
  <tr>
    <td>S8</td>
    <td>%</td>
    <td>mod</td>
  </tr>
  <tr>
    <td>S9</td>
    <td>!</td>
    <td>fact</td>
  </tr>
  <tr>
    <td>S10</td>
    <td>^</td>
    <td>pow</td>
  </tr>
  <tr>
    <td>S11</td>
    <td>=</td>
    <td> </td>
  </tr>
  <tr>
    <td>S12</td>
    <td>(</td>
    <td>leftbracket</td>
  </tr>
  <tr>
    <td>S13</td>
    <td>)</td>
    <td>rightbracket</td>
  </tr>
  <tr>
    <td>SX</td>
    <td>未知态,出错</td>
    <td> </td>
  </tr>
</table>
<p> </p>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -