始识别一个单词时若扫视到的第一个字符为字母则把后续输入的字母或数字字符依次进行拼接直至扫视到非字母、数字字符为止以期获得一个尽可能长的字母数字字符串然后以此字符串查所谓保留字表此保留字表要事先造好若查到此字符串则取出相应的类别码反之则表明该字符串应为一标识符。
fv10可编辑可修改采用上述策略后针对表I中的部分单词可以参考教材P80的图322见图1
图1识别表I所列语言中的部分单词的DFA及相关的语义过程图1中所出现的语义变量及语义函数的含义和功能说明如下
函数GETCHAR每调用一次就把扫描指示器当前所指示的源程序字符送入字符变量ch然后把扫描指示器前推一个字符位置。
字符数组TOKEN用来依次存放一个单词词文中的各个字符。
函数CAT每调用一次就把当前ch中的字符拼接于TOKEN中所存字符串的右边。
函数LOOKUP每调用一次就以TOKEN中的字符串查保留字表若查到就将相应关键字的类别码赋给整型变量c否则将c置为零。
函数RETRACT每调用一次就把扫描指示器回退一个字符位置即退回多读的那个字符。
函数OUT一般仅在进入终态时调用此函数调用的形式为OUTcVAL。其中实参c为相应单词
f的类别码助记符实参VAL为TOKEN即词文或为空串。函数OUT的功能是在送出一个单词的内部表示之后返回到调用该词法分析程序的那个程序。
总的来说开发一种新语言时由于它的单词符号在不停地修改采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了则采用手工编写词法分析程序效率更高。
四源程序
i
clude
i
clude
i
clude
i
clude
defi
eID6
defi
eINT7
defi
eLT8
defi
eLE9
defi
eEQ10
defi
eNE11
defi
eGT12
defi
eGE13
defi
eIS14
defi
ePL15
defi
eMI16
defi
eMU17
defi
eDI18
defi
eMAX_KEY_NUMBER20ch
fseekfp11retur
POINT
fifchEcheretur
POWER
ifchretur
PLUS
ifchretur
MINUS
retur
OTHER