c#实现科学计算器 —— 设计篇之词法分析模块设计

词法分析模块的功能
  负责对用户输入的表达式进行分词处理,把每一个合法符号(包括数)存入一个特定的存储结构中,能够供之后的文法分析模块和计算模块使用,如果发现非法符号马上停止处理,报错。

合法符号表
第一个版本支持的合法符号列表如下:

符号 类型编号 分类自定义名称
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

你可能感兴趣的:(C++,c,C#)