📄 lexical.h
字号:
//这是词法分析程序lexical.h
#include "stdlib.h"
#include "stdio.h"
#include "iomanip.h"
#include "getchar.h"
#include "check.h"
#include "LinkedList.h"
#include "filelist.h"
#include "Error.h"
const MAXPATHLEN=30; //规定源文件路径的最大长度
//定义三个全局链表类,类定义包含在LinkedList.h文件中
LinkedList<word> varlist; //全局链表用来存放变量
LinkedList<word> symbolist; //存放符号
LinkedList<word> wordlist; //存放整个程序的单词
//定义一个二维数组存放各单词名
//char name[5][10]={"KEYWORD","VARIABLE","CONST","SYMBOL","ERRORSYM"}
void lexical()
{
//找到源文件所在的位置
ifstream sourfile[MAXPATHLEN];
cout<<"please input the path of the source file:";
//将文件路径保存在filename中
char filename[MAXPATHLEN];
cin.getline(filename,MAXPATHLEN);
cout<<endl;
int i=0;
sourfile[0].open(filename,ios::in|ios::nocreate);
//如果第一次打开文件不成功,提供重新输入机会和退出选择
while(!sourfile[i])
{
i++;
cout<<"file can't be open,input once more,input exit to exit:";
char* fp=filename;
cin.getline(fp,MAXPATHLEN);
cout<<endl;
if(!strcmp(filename,"exit")) exit(0);
sourfile[i].open(filename,ios::in|ios::nocreate);
}
//为了确定文件取单词时的循环次数,读一遍文件确定行数
char s;
int countline=1; //放置源文件行数
while(!sourfile[i].eof())
{
sourfile[i].get(s);
if(s==0xA) countline++;
if(!s) break;
}
sourfile[i].close();
//重新打开文件进行取单词,并对单词进行相应判断操作
ifstream newsour;
newsour.open(filename,ios::in|ios::nocreate);
int err=0; //记录错误单词数
while(w.line!=countline&&!newsour.eof())
{
//将文件中字符流分成一个个单词流,包含在getchar.h头文件中
getword(w,newsour);
//如果是注释信息,则跳过注释
if(!strcmp(w.ch,"/*"))
{
getword(w,newsour);
while(strcmp(w.ch,"*/")&&w.line!=countline)
{getword(w,newsour);}
getword(w,newsour);
}
if(!strcmp(w.ch,"//"))
{
int l=w.line;
getword(w,newsour);
while(w.line==l)
{getword(w,newsour);}
}
if(!strcmp(w.ch,"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -