编译原理实验1 词法分析
//词法分析程序(识别关键字、标识符、常数、运算符、界符)
#include <stdio.h>
#include <iostream>
using namespace std;
#include <string.h>
#include <fstream>
#include<iomanip>
#define norw 25 //关键字个数
#define al 10 //符号的最大长度
#define nmax 14 //number的最大位数
#define getchdo if(-1==getch()) return -1
char ch; //获取字符的缓冲区,getch使用
double num,num1,num2 ; //常数转换
int cc,ll; //getch使用的计数器,cc表示当前字符(ch)的位置
int lines=0; //字符所在的行号
int errors=0; //错误的个数
char line[81]; //读取行缓冲区
enum symbol{ //符号类型
number,becomes,nul,leq,lss,geq,gtr,plus_,minus_,
times,slash,lparen,rparen,lmparen,rmparen,lbparen,
rbparen,eql,comma,period,neq,semicolon,ident,breaksym,
casesym,charsym,classsym,continuesym,dosym,doublesym,
elsesym,enumsym,externsym,falsesym,floatsym,forsym,
friendsym,ifsym,intsym,longsym,namespacesym,mainsym,
returnsym,switchsym,truesym,usingsym,voidsym,whilesym
};
enum symbol sym; //当前的符号
enum symbol wsym[norw]; //关键字对应的符号值
enum symbol ssym[256]; //单字符的符号值
char id[al+1]; //当前ident,多出的一个字节用于存放0
char a[al+1]; //临时符号,多出的一个字节用于存放0
char word[norw][al]; //关键字
FILE *fin; //指向文件的指针
void init() //初始化
{
int i;
for(i=0;i<=255;i++) //设置单字符符号
{
ssym[i]=nul;
}
ssym['+']=plus_;
ssym['-']=minus_;
ssym['*']=times;
ssym['/']=slash;
ssym['(']=lparen;
ssym[')']=rparen;
ssym['[']=lmparen;
ssym[']']=rmparen;
ssym['{']=lbparen;
ssym['}']=rbparen;
ssym['=']=eql;
ssym[',']=comma;
ssym['.']=period;
ssym['#']=neq;
ssym[';']=semicolon;
//设置关键字名字,按照字母顺序,便于折半查找
strcpy(&(word[0][0]),"break");
strcpy(&(word[1][0]),"case");
strcpy(&(word[2][0]),"char");
strcpy(&(word[3][0]),"class");
strcpy(&(word[4][0]),"continue");
strcpy(&(word[5][0]),"do");
strcpy(&(word[6][0]),"double");
strcpy(&(word[7][0]),"else");
strcpy(&(word[8][0]),"enum");
strcpy(&(word[9][0]),"extern");
strcpy(&(word[10][0]),"false");
strcpy(&(word[11][0]),"float");
strcpy(&(word[12