通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。

1.初始化:从文件将源程序全部输入到字符缓冲区中。2.取单词前:去掉多余空白。
3.取单词后:去掉多余空白(可选,看着办)。
4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)
5.显示结果。
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- #define FILENAME "D:\\java\\text.c"
- #define MODE "r"
-
- const char *key[] = {"main", "int", "char", "f1oat", "doub1e", "if", "for", "while", " return"};
- const char *border[] = {",", ";", "{", "}", "(", ")"};
- const char *arithmetic[] = {"+", "_", "*", "/", "<", ">", "<=", ">=", "=", "<>"};
-
- FILE *fp;
-
-
- char nextChar() {
- char ch = EOF;
- if (!feof(fp)) {
- ch = fgetc(fp);
- }
- return ch;
- }
-
- int isin(char str[], int type) {
- int i = 0;
- switch (type) {
- case 1: {
- for (i = 0; i < 9; ++i) {
- if (strcmp(str, key[i]) == 0) {
- return i + 1;
- }
- }
- break;
- }
- case 4: {
- for (i = 0; i < 10; ++i) {
- if (strcmp(str, arithmetic[i]) == 0) {
- return i + 1;
- }
- }
- break;
- }
- case 5: {
- for (i = 0; i < 6; ++i) {
- if (strcmp(str, border[i]) == 0) {
- return i + 1;
- }
- }
- break;
- }
- }
- return 0;
- }
- char alphaprocess(char ch) {
- char buffer[1024];
- int bufPtr = 0;
- while (isalpha(ch) || isdigit(ch) ||'_' == ch) {
- buffer[bufPtr++] = ch;
- ch = nextChar();
- }
- buffer[bufPtr] = '\0';
- if (isin(buffer, 1)) {
- printf("(1,\"%s\")\n", buffer);
- } else {
- printf("(2,\"%s\")\n", buffer);
- }
- return ch;
- }
-
- char digitprocess(char ch) {
- char buffer[1024];
- int bufPtr = 0;
- while (isdigit(ch) || '.' == ch) {
- buffer[bufPtr++] = ch;
- ch = nextChar();
- }
- buffer[bufPtr] = '\0';
- printf("(3,\"%s\")\n", buffer);
- return ch;
-
- }
-
-
- char otherprocess(char ch) {
- char buffer[3];
- buffer[0] = ch;
- buffer[1] = buffer [2] = '\0';
- char lookahead = nextChar();
- if (isspace(ch)) {
- return lookahead;
- } else if (isin(buffer, 5)) {
- printf("(5, \"%s\")\n", buffer);
- } else if (isin(buffer, 4)) {
- buffer[1] = lookahead;
- if (isin(buffer, 4)) {
- printf("(4,\"%s\")\n", buffer);
- } else {
- buffer[1] = '\0';
- ungetc(lookahead, fp);
- printf("(4,\"%s\")\n", buffer);
- }
- }
- return lookahead;
- }
-
-
-
- int main(void)
- {
- char ch;
- if ((fp = fopen(FILENAME,MODE)) == NULL) {
- printf("Error : File does not exist.");
- }
- ch = nextChar();
- while (ch != EOF) {
- if (isalpha(ch)) {
- ch = alphaprocess(ch);
- }
- else if (isdigit(ch)) {
- ch = digitprocess(ch);
- } else {
- ch = otherprocess(ch);
- }
-
- }
- fclose(fp);
- system("pause");
- return 0;
- }
运行图: