📄 readme.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> 符号</td>
<td> 类型编号</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"> <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> 状态</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 + -