感觉这个挺好耍的,书上的代码有错误,而且功能有限。
一、词法分析
特点:
(1)可对中文进行识别
(2)暂不支持负数,可以在读入‘-'时进行简单标记后就能对简单负数进行识别了。
#include <iostream> #include <cstdio> #include <cctype> #include <cstring> using namespace std; #define KEYWORDNUM 9 // 关键字个数 #define MAXLENGTH 39 // 标识符最大长度 #define MAXFILENAME 100 // 文件名最大长度 namespace Testscan { FILE *fin, *fout; char Scanin[MAXFILENAME], Scanout[MAXFILENAME]; char *keyword[KEYWORDNUM] = {"if", "else", "for", "while", "do", "int", "read", "write", "main"}; char singleword[] = "+-*%(){};,:"; char doubleword[] = "><=!"; char token[MAXLENGTH + 2]; // 存放识别单词 int frow, brow; // 符号起止行标记 int i, j, k, es; // 临时整型变量 char ch, ch1; // 临时字符变量 } using namespace Testscan; /***************************** 错误列表: 打开输入文件出错 打开输出文件出错 标识符过长 标识符命名不合法 ******************************/ int Init() { // printf("请输入源程序文件名(包括路径): "); // scanf("%s", Scanin); // printf("请输入词法分析输出文件名(包括路径): "); // scanf("%s", Scanout); strcpy(Scanin, "C:\Users\Administrator\Desktop\in.txt"); strcpy(Scanout, "C:\Users\Administrator\Desktop\out1.txt"); if ((fin = fopen(Scanin, "r")) == NULL) { printf("打开词法分析输入文件出错! "); return 1; } if ((fout = fopen(Scanout, "w")) == NULL) { printf("创建词法分析输出文件出错! "); return 2; } return 0; } char getNextChar() { char ch = getc(fin); if (ch == ' ') frow++; return ch; } int TESTscan() { int es = Init(); if (es > 0) return es; frow = brow = 1; ch = getNextChar(); while (ch != EOF) { while (ch == ' ' || ch == ' ' || ch == ' ') { ch = getNextChar(); } brow = frow; if (ch == EOF) break; if (isalpha(ch)) { // 字母 j = 0; token[j++] = ch; bool isLong = false; // 超长标记 ch = getNextChar(); while (isalnum(ch)) { // 字母+数字 token[j++] = ch; ch = getNextChar(); if (j > MAXLENGTH) { isLong = true; while (isalnum(ch)) { // 超长自动截断 ch = getNextChar(); } } } token[j] = '