(1)待分析的简单语言的词法
1) 关键字
begin if thenwhile 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;ifx>0 then x:=2*x+1/3;end# 经词法分析后输出如下序列:(1,begin)(10,’x’) (18,:=) (11,9) (26,;) (2,if)……
代码如下:
#include "stdafx.h"
#include <string.h>int main()
{
int p = 0;
int q;
int syn;
printf("please input string : \n");
char ch[100];
gets_s(ch);
char *key[6] = { "begin","if","then","while","do","end" };
/*do {
ch[p++] = getchar();
} while (getchar() != '#');*/
p = 0;
do {
char token[100] = {};
q = 0;
while (ch[p] == ' ') {
p++;
}
if ((ch[p] >= 'a'&&ch[p] <= 'z') || (ch[p] >= 'A'&&ch[p] <= 'Z')) {
token[q++] = ch[p];
p++;
while ((ch[p] >= '0'&&ch[p] <= '9') || (ch[p] >= 'a'&&ch[p] <= 'z') || (ch[p] >= 'A'&&ch[p] <= 'Z')) {
token[q++] = ch[p++];
}
syn = 10;