词法分析实战

题目:

在这部分中,你将使用图转移算法手工实现一个小型的词法分析器。
* 分析器的输入:存储在文本文件中的字符序列,字符取自ASCII字符集。文件中可能包括四种记号:关键字if、符合C语言标准的标识符、空格符、回车符\n。
* 分析器的输出:打印出所识别的标识符的种类、及行号、列号信息。

根据题目的要求,定义如下的Token类:

enum TokenType{
TT_ID,
TT_IF
};

class Token {
public:
Token(){}
Token(TokenType _t, string _n, int _l, int _c) { mType = _t; mName = _n; mLine = _l; mColumn = _c; }
~Token(){}
string toString();
TokenType mType;
string mName;
int mLine;
int mColumn;
};

重点实现获取Token的方法:

Token* nextToken(string& input)
{
if (input.empty()) {
return NULL;
}
string name;
int i = 0;
if (input[i] == ' ') {
input = input.substr(1);
gColumn += 1;
return nextToken(input);
}
else if (input[i] == '\n') {
input = input.substr(1);
gLine += 1;
gColumn = 1;
return nextToken(input);
}
else if (input[i] == 'i') {
i++;
name.append("i");
if (input[i] == 'f') {
i++;
name.append("f");
while ((input[i] >= 'a' && input[i] <= 'z') ||
(input[i] >= 'A' && input[i] <= 'Z') ||
(input[i] >= '0' && input[i] <= '9') || input[i] == '_') {
name.append(input.substr(i, 1));
i++;
}
if (name.compare("if") == 0) {
input = input.substr(i);
Token *token = new Token(TT_IF, "", gLine, gColumn);
gColumn += i;
return token;
}
else {
input = input.substr(i);
Token *token = new Token(TT_ID, name, gLine, gColumn);
gColumn += i;
return token;
}
}
else {
while ((input[i] >= 'a' && input[i] <= 'z') ||
(input[i] >= 'A' && input[i] <= 'Z') ||
(input[i] >= '0' && input[i] <= '9') || input[i] == '_') {
name.append(input.substr(i, 1));
i++;
}
input = input.substr(i);
Token *token = new Token(TT_ID, name, gLine, gColumn);
gColumn += i;
return token;
}
}
else if ((input[i] >= 'a' && input[i] <= 'z') ||
(input[i] >= 'A' && input[i] <= 'Z') || input[i] == '_') {
i++;
name.append(input.substr(0, 1));
while ((input[i] >= 'a' && input[i] <= 'z') ||
(input[i] >= 'A' && input[i] <= 'Z') ||
(input[i] >= '0' && input[i] <= '9') || input[i] == '_') {
name.append(input.substr(i, 1));
i++;
}
input = input.substr(i);
Token *token = new Token(TT_ID, name, gLine, gColumn);
gColumn += i;
return token;
}
else {
input = input.substr(1);
gColumn += 1;
return nextToken(input);
}
}

代码比较挫,不多说了,感兴趣的自己看吧。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此资源包含源代码和实验报告。 一、实验目的 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 二、实验要求 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、数据、运算符、分界符等五大类,并依次输出各个单词的种类及单词符号自身值。若遇到错误则显示“Error”,然后跳过错误部分继续显示 。 三、实验内容 通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示。 以下是实现词法分析设计的主要工作: (1)从源程序文件中读入字符。 (2)删除空格类字符,包括回车、制表符空格。 (3)按拼写单词,并用(单词,属性)二元式表示。 (4)如果发现错误则报告出错。 单词的基本分类: 关键字:由程序语言定义的具有固定意义的标识符。也称为保留字例如 i f、const; 单词种别码为1。 标识符:用以表示各种名字,如变量名、数组名、函数名;种别码为2。 数据: 任何数值常数。如 125,3.14等;种别码为3。 运算符:+、-、*、/、<、、>=、;种别码为4。 分界符: ; 、, 、(、) 、[、];种别码为5。 Error:#、%等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值