源代码的单词及其种别码如下: 类别 单词 编码 关键字 if 1 then 2 do 3 while 4 begin 5 end 6 标识符 以字母开头,后跟字母或者数字 7 常数 所有非负整数 8 运算符 + 9 - 10 * 11 / 12 = 13 > 14 < 15 界符 ; 16 ( 17 ) 18 { 19 } 20 2、采用c语言编写,编写能够识别上面单词的词法分析程序。
时间: 2023-07-16 19:12:50 浏览: 164
编译原理词法分析和语法分析报告+代码(C语言版)[1].doc
以下是用C语言编写的词法分析程序:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
// 定义关键字
char *keywords[] = {"if", "then", "do", "while", "begin", "end"};
// 定义种别码
enum {
KEYWORD_IF = 1,
KEYWORD_THEN,
KEYWORD_DO,
KEYWORD_WHILE,
KEYWORD_BEGIN,
KEYWORD_END,
IDENTIFIER,
CONSTANT,
OPERATOR_ADD,
OPERATOR_SUBTRACT,
OPERATOR_MULTIPLY,
OPERATOR_DIVIDE,
OPERATOR_ASSIGN,
OPERATOR_GT,
OPERATOR_LT,
DELIMITER_SEMI_COLON,
DELIMITER_LEFT_PARENTHESIS,
DELIMITER_RIGHT_PARENTHESIS,
DELIMITER_LEFT_BRACE,
DELIMITER_RIGHT_BRACE
};
int main() {
char input[100];
printf("请输入表达式:");
fgets(input, 100, stdin);
int i = 0;
while (input[i]) {
// 跳过空格和换行符
if (isspace(input[i])) {
i++;
continue;
}
// 处理关键字和标识符
if (isalpha(input[i])) {
char word[20];
int j = 0;
while (isalnum(input[i])) {
word[j] = input[i];
i++;
j++;
}
word[j] = '\0';
// 判断是否是关键字
int k;
for (k = 0; k < 6; k++) {
if (strcmp(word, keywords[k]) == 0) {
printf("%d ", k + 1);
break;
}
}
// 如果不是关键字,则是标识符
if (k == 6) {
printf("%d ", IDENTIFIER);
}
continue;
}
// 处理常数
if (isdigit(input[i])) {
int num = 0;
while (isdigit(input[i])) {
num = num * 10 + input[i] - '0';
i++;
}
printf("%d ", CONSTANT);
continue;
}
// 处理运算符
switch (input[i]) {
case '+':
printf("%d ", OPERATOR_ADD);
break;
case '-':
printf("%d ", OPERATOR_SUBTRACT);
break;
case '*':
printf("%d ", OPERATOR_MULTIPLY);
break;
case '/':
printf("%d ", OPERATOR_DIVIDE);
break;
case '=':
printf("%d ", OPERATOR_ASSIGN);
break;
case '>':
printf("%d ", OPERATOR_GT);
break;
case '<':
printf("%d ", OPERATOR_LT);
break;
default:
break;
}
i++;
// 处理界符
switch (input[i]) {
case ';':
printf("%d ", DELIMITER_SEMI_COLON);
break;
case '(':
printf("%d ", DELIMITER_LEFT_PARENTHESIS);
break;
case ')':
printf("%d ", DELIMITER_RIGHT_PARENTHESIS);
break;
case '{':
printf("%d ", DELIMITER_LEFT_BRACE);
break;
case '}':
printf("%d ", DELIMITER_RIGHT_BRACE);
break;
default:
break;
}
i++;
}
return 0;
}
```
该程序可以读取用户输入的表达式,将其分解成单词并输出对应的种别码。例如,输入`if (a > 3) then b = 4;`,程序输出`1 17 7 14 8 18 2 7 13 8 16`,表示输入包含关键字“if”(1号种别码)、左括号(17号种别码)、标识符“a”(7号种别码)、大于号(14号种别码)、常数“3”(8号种别码)、右括号(18号种别码)、关键字“then”(2号种别码)、标识符“b”(7号种别码)、赋值号(13号种别码)、常数“4”(8号种别码)、分号(16号种别码)。
阅读全文