一:实验指导书
对下述单词表定义的语言设计编制一个词法分析器。单词符号及种别表和词法分析器功能及基本要求如下:
(1)单词符号及种别表
单词符号 |
种别编码 |
单词值 |
main |
1 |
|
int |
2 |
|
float |
3 |
|
double |
4 |
|
char |
5 |
|
if |
6 |
|
else |
7 |
|
do |
8 |
|
while |
9 |
|
l(l|d)* |
10 |
内部字符串 |
( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε) |
20 |
二进制数值表示 |
= |
21 |
|
+ |
22 |
|
- |
23 |
|
* |
24 |
|
/ |
25 |
|
( |
26 |
|
) |
27 |
|
{ |
28 |
|
} |
29 |
|
, |
30 |
|
; |
31 |
|
> |
32 |
|
>= |
33 |
|
< |
34 |
|
<= |
35 |
|
== |
36 |
|
!= |
37 |
|
# |
0 |
(2)词法分析器功能及基本要求
处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码
token为存放的单词自身字符串
sum为数字的数值(用科学计数法输出)
(3)主要参考步骤
1:画出识别上述语言单词的状态转换图
2:用C/C++语言编写词法分析程序(应考虑能被语法分析程序调用)
3:预处理,去除注释、多余空格、Tab字符、回车换行符等
4:设计若干用例,上机测试并通过所设计实现的词法分析器
1. +++-123.456e-127*+45.99e+200++abc+-cnt++49
2. (+123.456+-456.789e-120)*m2+(a++456)*-c123
3. ++4+1.4
4. a+-149+49.7e+127+m123
5. x=a++1.27e+18
6. --20+-124.987e+127+-xyz
begin if(x>=-1.27e-18) xyz=(x1+y1)* -124.987e+127
7. --20+-124. e+111-137++569.246e+(123+ivar);
x=1;if(x>1) y=1234; x=(123+abc); (本例应有出错信息)
(4)思考
数字的正负号与运算符加减如何处理,识别数字的DFA怎样和运算符加减等融合在一起,进而指导词法分析器的程序编写。
二:C语言实现词法分析器
(1)算法及流程图
算法的基本思想是从输入缓冲区循环读取字符,根据扫描的第一个字符类型(必要时也可向前向后看)对照单词符号及种别表拼出相应的单词符号。
(2)代码示例
时间: 2024-12-21 11:45:18