编译原理上机实验报告[1]
- 格式:docx
- 大小:29.01 KB
- 文档页数:16
编译技术上机实验题目
实验一
一、题目
编制C语言子集的词法分析程序
二、目的
通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
三、要求
1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表
2.1;在上机前一定要制出相应的表。
2.程序功能
输入:字符串。
输出:二元式(种别编码,单词自身)构成的序列。
举例:
输入:a=$;#
输出:(6,a)
(12,=)
FOUND ERROR
(13,;)
#include
#include
using namespace std;
string key[6] = {"begin", "if", "then", "while", "do", "end"}; //关键字
bool isKey( string str, int &syn) //判断是否为关键字,若是传回相应关键码的种别名
{
int i;
for(i=0; i<6; i++)
{
if(str == key)
{
syn = i + 1;
return true;
}
}
return false;
}
bool isLetter(char c) //是否为字母
{
if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
return true;
else
}
bool isDigit(char c) //是否为数字
{
if(c >= '0' && c <= '9')
return true;
else
return false;
}
void analyse(FILE *fileP)
{
int n;
char c;
string str = "";
while((c = fgetc(fileP)) != EOF)
{
if(c == ' ' || c == '\n' || c == '\t')
continue;
else if(isDigit(c)) //数字
{
while(isDigit(c))
{
str += c;
c = fgetc(fileP);
}
fseek(fileP, -1, SEEK_CUR);
cout << "(11, " << str << ")" << endl;
str = "";
}
else if(isLetter(c)) //字母开头的
{
while(isDigit(c) || isLetter(c))
{
str += c;
c = fgetc(fileP);
}
fseek(fileP, -1, SEEK_CUR);
if(isKey(str, n))
cout << "(" << n << ", " << str << ")" << endl; //关键码
else
cout << "(10, " << "\'"<< str << "\'" << ")" << endl; //标志符str = "";
}
{
switch(c)
{
case '+':
cout << "(13, +)" << endl;
break;
case '-':
cout << "(14, -)" << endl;
break;
case '*':
cout << "(15, *)" << endl;
break;
case '/':
cout << "(16, /)" << endl;
break;
case ':':
{
if(c=fgetc(fileP) == '=')
cout << "(18, :=)" << endl;
else
{
cout << "(17, 编译技术上机实验题目
实验一
一、题目
编制C语言子集的词法分析程序
二、目的
通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
三、要求
1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表
2.1;在上机前一定要制出相应的表。
2.程序功能
输入:字符串。
输出:二元式(种别编码,单词自身)构成的序列。
举例:
输入:a=$;#
输出:(6,a)
(12,=)
FOUND ERROR
(13,;)
#include
#include