【实验目的】
(1)理解词法分析在编译程序中的作用
(2)加深对有穷自动机模型的理解
(3)掌握词法分析程序的实现方法和技术
【实验内容】
对一个简单语言的子集编制一个一遍扫描的词法分析程序。
【实验要求】
(1)待分析的简单语言的词法
1) 关键字
begin if then while do end
2) 运算符和界符
:= + - * / < <= > >= <> = ; ( ) #
3) 其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
(2)各种单词符号对应的种别编码
单词符号 |
种别码 |
单词符号 |
种别码 |
begin |
1 |
: |
17 |
if |
2 |
:= |
18 |
then |
3 |
< |
20 |
while |
4 |
<> |
21 |
do |
5 |
<= |
22 |
end |
6 |
> |
23 |
letter(letter|digit)* |
10 |
>= |
24 |
digitdigit* |
11 |
= |
25 |
+ |
13 |
; |
26 |
- |
14 |
( |
27 |
* |
15 |
) |
28 |
/ |
16 |
# |
0 |
(3)词法分析程序的功能
输入:所给文法的源程序字符串
输出:二元组(syn,token或sum)构成的序列。
syn为单词种别码;
token为存放的单词自身字符串;
Sum 为整形常数。
例如:对源程序begin x:=9;if x>0 then x:=2*x+1/3;end# 经词法分析后输出如下序列:(1,begin)(10,’x’) (18,:=) (11,9) (26,;) (2,if)……
直接上代码
1 #include<iostream> 2 using namespace std; 3 bool is_digit(char ch); 4 bool is_letter(char ch); 5 char example[10000]; //缓冲区 6 char token[10]; //标识符 7 int syn, sum; 8 const char* keyword[10] = { "begin","if","then","while","do","end" }; //关键字 9 int example_p;//缓冲区指针 10 int token_p;//标识符指针 11 char ch; 12 13 //扫描 14 void scan() { 15 16 memset(token, 0, sizeof(token)); //数组清零 17 token_p = 0; 18 while (ch ==' ') { 19 example_p++; 20 ch = example[example_p]; 21 } 22 23 //字符是数字 24 if (is_digit(ch)) { 25 sum = 0; 26 //检索数字 27 while (is_digit(ch)) { 28 //得到结果 29 sum = sum * 10 + ch - '0'; //将字符转换成数字 30 example_p++; 31 ch = example[example_p]; 32 syn = 11; 33 } 34 35 } 36 //字符是字母 37 else if (is_letter(ch)) { 38 //检索标识符、关键字 39 while (is_digit(ch) || is_letter(ch)) { 40 token[token_p] = ch; 41 token_p++; 42 example_p++; 43 ch = example[example_p]; 44 } 45 46 47 token[token_p] = '