正规文法:
E→LBNSS→+(),N→DNDD→0123456789L→ABCYZabcyzB→LBDBLD
状态图:
空白字母与数字
0
字母
1
非字母与数字
2
数字579
非数字
4
6
8
100
非
110
其他120
其中一个圆圈的是非终态,两个圆圈的是终态,两个圆圈且带一个的是终态且多读了一个
f字符。
单词种别定义:
单词符号programbegi
e
dvari
ta
dor
otifthe
elsewhiledo标示符常数(整)种别编码123456789101112131415单词符号+(),种别编码1617181920212223242526272829
运行环境介绍:
采用C语言编写,VS2010编译调试。
关键算法描述:
chfgetcfp1li
eNumifchchfgetcfp1li
eNumifchchfgetcfp1whilechEOFch
chfgetcfp1ifch
rowNumli
eNum0
felsebreakelseifchMark1lo
gle
ftellfp1i
tr
rowNumi
tl
li
eNumi
tsig
0chfgetcfp1li
eNumwhilechEOFsig
2ifch
rowNumli
eNum0ifchsig
1sig
2elsesig
0ifchsig
1chfgetcfp1li
eNumifsig
2fseekfp11L1li
eNumelseMark1fseekfp1le
20li
eNuml
2rowNumr
chelseError_Ha
dlerowNumli
eNum1fseekfp11L1li
eNum
f
此段代码主要用于对注释的处理,当读到一个字符是,继续读其下一位字符,如果下一位字符是,则其后整行内容作为注释,不对其进行词法分析,一直往后读直到遇到换行符
。如果下一位字符是,则一直往后读,直到遇到一个连续的,其中间内容作为注释,不对其进行词法分析;如果读到文件结尾也没用遇到一个连续的,则将字符指针移回处,并将Mark变量置为1。如果下一位字符不是,也不是或Mark为1,则对进行报错处理。此过程的状态转换图如下:3非12467
非不是,也不是或Mark为15状态3表示为行注释,本行后面的内容都是注释;状态7表示为注释,和中间的内容为注释;状态5表示既不是行注释,也不是注释,要进行其他处理(如:报错)。由于报错需要准错的指出错误的行号和列号,在程序中定义了两个变量rowNum和li
eNum,每当读一个字符时,li
eNum加1,当读到换行符时,rowNum加1,并将li
eNum置0,在对注释进行处理的时候也遵循这样的操作。这样,即使有注释也可以准确的指出错误的行和列了。
elseifIsLetterchwhileIsLetterchIsDigitchCo
catchchfgetcfp1li
eNumfseekfp11L1li
eNumi
tcodeReserveifcode0i
tId_Num0vectorstrir