词法分析模块的功能
负责对用户输入的表达式进行分词处理,把每一个合法符号(包括数)存入一个特定的存储结构中,能够供之后的文法分析模块和计算模块使用,如果发现非法符号马上停止处理,报错。
合法符号表
第一个版本支持的合法符号列表如下:
| 符号 | 类型编号 | 分类自定义名称 |
| ln | 1 | ln |
| lg | 2 | lg |
| log | 3 | log |
| ^ | 4 | pow |
| Cbrt | 6 | cbrt |
| Sbrt | 7 | sbrt |
| ! | 8 | fact |
| sin | 10 | sin |
| cos | 11 | cos |
| asin | 12 | asin |
| acos | 13 | acos |
| tg | 14 | tg |
| ctg | 15 | ctg |
| atg | 16 | atg |
| actg | 17 | actg |
| + | 18 | plus |
| - | 19 | minus |
| * | 20 | mutiple |
| / | 21 | divide |
| % | 23 | mod |
| ( | 24 | leftbracket |
| ) | 25 | rightbracket |
| ANS | 26 | ans |
| STO | 27 | sto |
| CLR | 28 | clr |
| AX | 29 | ax |
| BX | 30 | bx |
| CX | 31 | cx |
| DX | 32 | dx |
| EX | 33 | ex |
| FX | 34 | fx |
| e | 35 | e |
| PI | 36 | pi |
| 浮点数 | 37 | number |
| # | 38 | sharp |
分析策略
采用有限自动机(DFA)进行分析,对于特定符号如+、-、*、/、%、(、)、!、^、=,为每一个符号提供一个状态、而其他的一些由字母组成的符号,如ans、pi、sto、clr等,则作为是一个词,之后再对词进行分类处理。
具体的DFA状态图如下:
注:
1. 图中每一个箭头表明一个字符的输入,由于这个输入,自动机从一个状态变为另一个状态
2. 图中的负号和减号是两个完全不同的符号,大家不要根据常识认为是一样的,其实在实现时是用 '@'代负号的
各状态的说明如下
| 状态 | 说明 | 对应符号分类名称 |
| S0 | 初态 | |
| S1 | 整数串 | |
| S2 | 浮点数串 | number |
| S3 | 字母串 | ln、lg、log cos、sin、tg、ctg acos、asin、atg、actg cbrt、sbrt、ans、sto、 ax、bx、cx、dx、ex、fx pi、e |
| S4 | + | plus |
| S5 | - | minus |
| S6 | * | mutiple |
| S7 | / | divide |
| S8 | % | mod |
| S9 | ! | fact |
| S10 | ^ | pow |
| S11 | = | |
| S12 | ( | leftbracket |
| S13 | ) | rightbracket |
| SX | 未知态,出错 |
=====================================================================
科学计算器正式版已经于2006.1.4发布,详情请见 http://tonyqus.cnblogs.com/archive/2006/01/04/310481.html
博客介绍了词法分析模块的功能,它对用户输入的表达式进行分词处理,将合法符号存入特定存储结构供后续模块使用,若发现非法符号则停止处理并报错,还提及了第一个版本支持的合法符号列表。

被折叠的 条评论
为什么被折叠?



