📄 sample_fun.cpp
字号:
#include<iostream>
#include <fstream>
#include <string>
#include "myhead.h"
using namespace std;
sample::sample()
{
cout<<"\n****************************SAMPLE语言词法分析器*******************************\n";
cout<<"\n 作者: 林桂川\n";//作者姓名
cout<<"\n 计算机科学与技术04(1)班\n";//班级、学号
cout<<"\n 200433099345\n";//学号
cout<<"请输入测试程序名: ";
string name;
filename=getch_blank();
filename+=".txt";
text=NULL;
symbol=NULL;
symbol_number=0;
error=0;
warning=0;
}
sample::~sample()
{
}
bool sample::analyze_words_text() //词法分析函数
{
///////////////////////////////////////////////////
const char *name;
name=filename.data();
ifstream file(name,ios::in);
int work=0; //控制循环
if (file!=NULL)
{
system("cls");
cout<<"\n--------------------Configuration: ";
cout<<filename<<" - Win32 Debug--------------------"<<endl;
cout<<"Compiling..."<<endl;
cout<<filename<<endl<<endl;
word_chain *head=NULL;
word_chain *word_point;//用于记录当前单词在单词链中的指针
string words_line=""; //用于存储文中读取出来的一行字符
int line=0; //记录文件读取行数
while (file.peek()!=EOF)
{
line++;
getline(file,words_line); //读取一行字符串,准备分析
int length=words_line.length(); //记录取出的字符串的长度
for (int i=length-1;i>=0;i--) //略去最后的空格符
{
if (words_line[i]!=32)
break;
}
words_line=words_line.substr(0,i+1);
length=words_line.length(); //记录经过处理后的字符串的长度
int point=0; // 记录分离字符串单词时当前的位置
string word; //从字符串中分离的单词
int analyze_number=0; //分析结果数据存放
while (point<length)
{
word=separate_word(words_line,point); //分离单词 point有问题
if (word.length())
analyze_number=analyze_word(word);//分析单词,带出分析结果
int symbol_point=0; //暂时用于记录标志符等在文中出现的位置
switch(analyze_number)
{
case -1:
error++;
cout<<"ERROR "<<error<<": 非法字符(串) ("<<word<<") in line "<<line<<endl;
work=1;
break;
case -2:
error++;
cout<<"ERROR "<<error<<": 字符常数缺右边的单引号(') in line "<<line<<endl;
cout<<" tmissing (') behind ("<<word<<")"<<endl;
work=1;
break;
case -3:
error++;
cout<<"ERROR "<<error<<": 注释部分缺右边的界符(*/) in line "<<line<<endl;
cout<<" missing (*/) behind ("<<word<<")"<<endl;
work=1;
break;
case 36:
case 37:
case 38:
symbol_point=point_word(word); //暂时用于记录标志符等在文中出现的位置
break;
default:
symbol_point=0; //利用symbol_number区分非标志符值
}
if(!work)
{
if (analyze_number) //单词链中不加进注释行
{
head=new word_chain;
head->next=NULL;
head->word=word;
head->attribute=analyze_number;
if (!symbol_point)
{
if (analyze_number==36)
{
symbol_number++;
symbol_point=symbol_number;
head->order=symbol_point;
word_point=add_word(head);
add_symbol(word_point);
}
else
{
head->order=symbol_point;
word_point=add_word(head);
}
}
else
{
head->order=symbol_point;
word_point=add_word(head);
}
}
}
}
}
file.close();
if (!work)
{
cout<<endl<<filename<<" - "<<error<<" error(s), "<<warning<<" warning(s)"<<endl<<endl;
cout<<filename<<" 分析结果如下: "<<endl<<endl;
return true;
}
else
{
cout<<endl<<filename<<" - "<<error<<" error(s), "<<warning<<" warning(s)"<<endl<<endl;
return false;
}
}
else
{
cout<<"您要测试的文件不存在!按任何按键退出\n";
return false;
}
}
void sample::show_analyze_text() //词法分析通过之后显示单词的二元式序列
{
int i=1;
word_chain *s=text;
while (s!=NULL)
{
cout<<"(";
if (s->attribute<10)
cout<<" ";
cout<<s->attribute<<",";
if (!s->order)
cout<<" -)";
else
{
if (s->order<10)
cout<<" ";
cout<<s->order<<")";
}
if (i%5)
cout<<" ";
else
cout<<endl;
i++;
s=s->next;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -