山东科技大学学生课程设计
词法分析之基于文法的实现
一、设计目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
二、设计要求
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。 并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
三、设计说明 1. 需求分析:
a) 输入及其范围
识别保留字:if、int、for、while、do、return、break、continue等;
保留字类别码为1。
其他的都识别为标识符;单词类别码为2。 常数为无符号整形数;单词类别码为3。
运算符包括:+、-、*、/、=、>、<、>=、<=、!= ;类别码为4。 分隔符包括:,、;、{、}、(、); 类别码为5。 错误字符 类别码为 6。
10
山东科技大学学生课程设计
b) 输出形式
词法分析器的单词符号常常表示成以下的二元式(单词类别码,单词符号的属性值)。本实验中,可采用的是一大类符号一类别码的方式。
c) 程序功能
词法分析器的功能是输入源程序,输出单词符号。
d) 测试数据
测试输入的程序为:
main() {
int a, b; a = 10; b = a + 20;
}
2. 概要设计
a)数据类型的定义
定义三个字符串,用于输入程序单词的匹配。
string Rword[RWD] = {\string Opear[OPEAR] = {\string Separ[SEPAR] = {\
b) 主程序流程
11
山东科技大学学生课程设计
3. 详细设计
void main() {
vector
vector
/*将源代码中的单词从文件中读出按成分存放在input中*/ ifstream myf; string str = \
myf.open(\ if(myf.fail()) {
cout<<\ }
char ch;
ch = myf.get(); while(!myf.eof())
12
山东科技大学学生课程设计
{
for(int i=0;i < SEPAR;i++)//判断是否为分隔符 {
string temp = \ temp += ch;
if(temp == Separ[i]) {
if(str != \ {
input.push_back(str); str = \ }
str = ch;
input.push_back(str); str = \ ch=myf.get(); break; } }
if(ch=='\\t' || ch == ' ' || ch=='\\n')//判断是否为空格,回车
{
if(str != \ {
input.push_back(str); str = \ }
ch=myf.get(); }
else if(ch=='!' || ch=='>' || ch=='<' || ch=='=')//判断是否为运算符 {
if(str != \ {
input.push_back(str); str = \ }
13
相关推荐: