词法分析模块的功能
负责对用户输入的表达式进行分词处理,把每一个合法符号(包括数)存入一个特定的存储结构中,能够供之后的文法分析模块和计算模块使用,如果发现非法符号马上停止处理,报错。
合法符号表
第一个版本支持的合法符号列表如下:
符号 | 类型编号 | 分类自定义名称 |
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