有人知道编译原理实验之词法分析器用C++怎么做吗?

作者&投稿:曲图 (若有异议请与网页底部的电邮联系)
编译原理实验,说明语句的词法分析器,做好用C++写,发送到邮箱1172312385@qq.com,或者直接写也行~

你做白日梦吧?1000分也不会有人给你写:不信你到处提问试试,天下没有免费的午餐。

已发

#include "globals.h"
#include "util.h"
#include "scan.h"
#include "parse.h"

static TokenType token; /* holds current token */

/* function prototypes for recursive calls */
static TreeNode * stmt_sequence(void);
static TreeNode * statement(void);
static TreeNode * if_stmt(void);
static TreeNode * repeat_stmt(void);
static TreeNode * assign_stmt(void);
static TreeNode * read_stmt(void);
static TreeNode * write_stmt(void);
static TreeNode * exp(void);
static TreeNode * simple_exp(void);
static TreeNode * term(void);
static TreeNode * factor(void);

static void syntaxError(char * message)
{ fprintf(listing,"\n>>> ");
fprintf(listing,"Syntax error at line %d: %s",lineno,message);
Error = TRUE;
}

static void match(TokenType expected)
{ if (token == expected) token = getToken();
else {
syntaxError("unexpected token -> ");
printToken(token,tokenString);
fprintf(listing," ");
}
}

TreeNode * stmt_sequence(void)
{ TreeNode * t = statement();
TreeNode * p = t;
while ((token!=ENDFILE) && (token!=END) &&
(token!=ELSE) && (token!=UNTIL))
{ TreeNode * q;
match(SEMI);
q = statement();
if (q!=NULL) {
if (t==NULL) t = p = q;
else /* now p cannot be NULL either */
{ p->sibling = q;
p = q;
}
}
}
return t;
}

TreeNode * statement(void)
{ TreeNode * t = NULL;
switch (token) {
case IF : t = if_stmt(); break;
case REPEAT : t = repeat_stmt(); break;
case ID : t = assign_stmt(); break;
case READ : t = read_stmt(); break;
case WRITE : t = write_stmt(); break;
default : syntaxError("unexpected token -> ");
printToken(token,tokenString);
token = getToken();
break;
} /* end case */
return t;
}

TreeNode * if_stmt(void)
{ TreeNode * t = newStmtNode(IfK);
match(IF);
if (t!=NULL) t->child[0] = exp();
match(THEN);
if (t!=NULL) t->child[1] = stmt_sequence();
if (token==ELSE) {
match(ELSE);
if (t!=NULL) t->child[2] = stmt_sequence();
}
match(END);
return t;
}

TreeNode * repeat_stmt(void)
{ TreeNode * t = newStmtNode(RepeatK);
match(REPEAT);
if (t!=NULL) t->child[0] = stmt_sequence();
match(UNTIL);
if (t!=NULL) t->child[1] = exp();
return t;
}

TreeNode * assign_stmt(void)
{ TreeNode * t = newStmtNode(AssignK);
if ((t!=NULL) && (token==ID))
t->attr.name = copyString(tokenString);
match(ID);
match(ASSIGN);
if (t!=NULL) t->child[0] = exp();
return t;
}

TreeNode * read_stmt(void)
{ TreeNode * t = newStmtNode(ReadK);
match(READ);
if ((t!=NULL) && (token==ID))
t->attr.name = copyString(tokenString);
match(ID);
return t;
}

TreeNode * write_stmt(void)
{ TreeNode * t = newStmtNode(WriteK);
match(WRITE);
if (t!=NULL) t->child[0] = exp();
return t;
}

TreeNode * exp(void)
{ TreeNode * t = simple_exp();
if ((token==LT)||(token==EQ)) {
TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
}
match(token);
if (t!=NULL)
t->child[1] = simple_exp();
}
return t;
}

TreeNode * simple_exp(void)
{ TreeNode * t = term();
while ((token==PLUS)||(token==MINUS))
{ TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
match(token);
t->child[1] = term();
}
}
return t;
}

TreeNode * term(void)
{ TreeNode * t = factor();
while ((token==TIMES)||(token==OVER))
{ TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
match(token);
p->child[1] = factor();
}
}
return t;
}

TreeNode * factor(void)
{ TreeNode * t = NULL;
switch (token) {
case NUM :
t = newExpNode(ConstK);
if ((t!=NULL) && (token==NUM))
t->attr.val = atoi(tokenString);
match(NUM);
break;
case ID :
t = newExpNode(IdK);
if ((t!=NULL) && (token==ID))
t->attr.name = copyString(tokenString);
match(ID);
break;
case LPAREN :
match(LPAREN);
t = exp();
match(RPAREN);
break;
default:
syntaxError("unexpected token -> ");
printToken(token,tokenString);
token = getToken();
break;
}
return t;
}

/****************************************/
/* the primary function of the parser */
/****************************************/
/* Function parse returns the newly
* constructed syntax tree
*/
TreeNode * parse(void)
{ TreeNode * t;
token = getToken();
t = stmt_sequence();
if (token!=ENDFILE)
syntaxError("Code ends before file\n");
return t;
}
上面是一个语法分析器的主代码部分它可以识别类似下面的代码,但是由于篇幅有限,上面的代码不是完整代码,完整代码太长,还有好几个文件。
read x; { input an integer }
if 0 < x then { don't compute if x <= 0 }
fact := 1;
repeat
fact := fact * x;
x := x - 1
until x = 0;
write fact { output factorial of x }
end

参考bison的手册,

那上面讲的还是挺详细的。

这些程序bison都可以自动生成。。
这个很简单啊~~~

怎么说呢???举个例子吧:

比如读int a = 3;

首先读入i,这是个字母,接着读下一个字符,一直读到既不是字母又不是数字的一个字符为止,把刚才读的那些字符存储起来,判读他是比变量还是关键字,
就像这个样子,一直读到文件结束符为止!!!
你按照我的方法,试着做一下!!!
#include "globals.h"
#include "util.h"
#include "scan.h"
#include "parse.h"

static TokenType token; /* holds current token */

/* function prototypes for recursive calls */
static TreeNode * stmt_sequence(void);
static TreeNode * statement(void);
static TreeNode * if_stmt(void);
static TreeNode * repeat_stmt(void);
static TreeNode * assign_stmt(void);
static TreeNode * read_stmt(void);
static TreeNode * write_stmt(void);
static TreeNode * exp(void);
static TreeNode * simple_exp(void);
static TreeNode * term(void);
static TreeNode * factor(void);

static void syntaxError(char * message)
{ fprintf(listing,"\n>>> ");
fprintf(listing,"Syntax error at line %d: %s",lineno,message);
Error = TRUE;
}

static void match(TokenType expected)
{ if (token == expected) token = getToken();
else {
syntaxError("unexpected token -> ");
printToken(token,tokenString);
fprintf(listing," ");
}
}

TreeNode * stmt_sequence(void)
{ TreeNode * t = statement();
TreeNode * p = t;
while ((token!=ENDFILE) && (token!=END) &&
(token!=ELSE) && (token!=UNTIL))
{ TreeNode * q;
match(SEMI);
q = statement();
if (q!=NULL) {
if (t==NULL) t = p = q;
else /* now p cannot be NULL either */
{ p->sibling = q;
p = q;
}
}
}
return t;
}

TreeNode * statement(void)
{ TreeNode * t = NULL;
switch (token) {
case IF : t = if_stmt(); break;
case REPEAT : t = repeat_stmt(); break;
case ID : t = assign_stmt(); break;
case READ : t = read_stmt(); break;
case WRITE : t = write_stmt(); break;
default : syntaxError("unexpected token -> ");
printToken(token,tokenString);
token = getToken();
break;
} /* end case */
return t;
}

TreeNode * if_stmt(void)
{ TreeNode * t = newStmtNode(IfK);
match(IF);
if (t!=NULL) t->child[0] = exp();
match(THEN);
if (t!=NULL) t->child[1] = stmt_sequence();
if (token==ELSE) {
match(ELSE);
if (t!=NULL) t->child[2] = stmt_sequence();
}
match(END);
return t;
}

TreeNode * repeat_stmt(void)
{ TreeNode * t = newStmtNode(RepeatK);
match(REPEAT);
if (t!=NULL) t->child[0] = stmt_sequence();
match(UNTIL);
if (t!=NULL) t->child[1] = exp();
return t;
}

TreeNode * assign_stmt(void)
{ TreeNode * t = newStmtNode(AssignK);
if ((t!=NULL) && (token==ID))
t->attr.name = copyString(tokenString);
match(ID);
match(ASSIGN);
if (t!=NULL) t->child[0] = exp();
return t;
}

TreeNode * read_stmt(void)
{ TreeNode * t = newStmtNode(ReadK);
match(READ);
if ((t!=NULL) && (token==ID))
t->attr.name = copyString(tokenString);
match(ID);
return t;
}

TreeNode * write_stmt(void)
{ TreeNode * t = newStmtNode(WriteK);
match(WRITE);
if (t!=NULL) t->child[0] = exp();
return t;
}

TreeNode * exp(void)
{ TreeNode * t = simple_exp();
if ((token==LT)||(token==EQ)) {
TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
}
match(token);
if (t!=NULL)
t->child[1] = simple_exp();
}
return t;
}

TreeNode * simple_exp(void)
{ TreeNode * t = term();
while ((token==PLUS)||(token==MINUS))
{ TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
match(token);
t->child[1] = term();
}
}
return t;
}

TreeNode * term(void)
{ TreeNode * t = factor();
while ((token==TIMES)||(token==OVER))
{ TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
match(token);
p->child[1] = factor();
}
}
return t;
}

TreeNode * factor(void)
{ TreeNode * t = NULL;
switch (token) {
case NUM :
t = newExpNode(ConstK);
if ((t!=NULL) && (token==NUM))
t->attr.val = atoi(tokenString);
match(NUM);
break;
case ID :
t = newExpNode(IdK);
if ((t!=NULL) && (token==ID))
t->attr.name = copyString(tokenString);
match(ID);
break;
case LPAREN :
match(LPAREN);
t = exp();
match(RPAREN);
break;
default:
syntaxError("unexpected token -> ");
printToken(token,tokenString);
token = getToken();
break;
}
return t;
}

/****************************************/
/* the primary function of the parser */
/****************************************/
/* Function parse returns the newly
* constructed syntax tree
*/
TreeNode * parse(void)
{ TreeNode * t;
token = getToken();
t = stmt_sequence();
if (token!=ENDFILE)
syntaxError("Code ends before file\n");
return t;
}
上面是一个语法分析器的主代码部分它可以识别类似下面的代码,但是由于篇幅有限,上面的代码不是完整代码,完整代码太长,还有好几个文件。
read x; { input an integer }
if 0 < x then { don't compute if x <= 0 }
fact := 1;
repeat
fact := fact * x;
x := x - 1
until x = 0;
write fact { output factorial of x }
end

这个很简单啊~~~

怎么说呢???举个例子吧:

比如读int a = 3;

首先读入i,这是个字母,接着读下一个字符,一直读到既不是字母又不是数字的一个字符为止,把刚才读的那些字符存储起来,判读他是比变量还是关键字,
就像这个样子,一直读到文件结束符为止!!!
你按照我的方法,试着做一下!!!

参考bison的手册,

那上面讲的还是挺详细的。

这些程序bison都可以自动生成。。

桂浩真害人啊。。。


软件类课程实验指导图书目录
实验一: SQL语言的数据库创建和基本表设计,奠定数据库基础。 实验二: 数据查询和更新操作,掌握SQL查询语言的运用。 ...(省略内容,包括视图、数据安全性和完整性等)...最后一章,编译原理实验包含:实验一: 词法分析器的制作,理解编译过程的初步步骤。 实验二: 语法分析器的构建,深入理解...

编译原理词法分析实验中, 文件写入顺序的问题(fputs)
1)fopen在代码中出现2次,没有必要 2)你的程序不对 你搞混和S这个字符和TOKEN。你的第一个WHILE读入的是字符S,而TOKEN是由若干字符S构成的。而你的SWITCH(S)里面按理应该是组成TOKEN的规则,而你直接就输出了。这样如果你要结果,我给你改了下,你看下:int main(){ char token[20] = {'...

编译原理语法分析实验问题
错误1:在3.txt中,第二个表达式x:=2*3,在编译器里面没有对*符号进行解释,这个应补充,或者改掉*为+。错误2:代码中出现3次类似syn==15||16的代码,我理解应该是(syn==15)||(syn==16)改掉这两点后代码可以正常运行。建议:写代码是一项工作,更是一个创作过程,建议你按照代码写作规范来写...

学习编译原理哪本书好
《编译原理》作者Alfred V.Aho、Ravi Sethi和Jeffrey D.Ullman是世界著名的计算机 科学家,他们在计算机科学理论、数据库等很多领域都做出了杰出贡献。《编译原理》 是编译领域无可替代的经典著作,被广大计算机专业人士誉为“龙书”。《编译原理》一 直被世界各地的著名高等院校和科研机构(如贝尔实验室、...

不要学计算机 学计算机我后悔了
再者,培训机构也是程序员的孵化地,但是培训机构一味去追逐社会热门技术,就不会像大学一样让我们学习一些理论,比如说是数据库原理,编译原理,操作系统,计算机组成原理等,再加上培训机构一般只培训几个月,想一想,几个月把教你这么多东西,你能实际操作了,程序员最注重的就是实际操作,编程能力,...

编译原理的词法分析器(c++语言)实验总是出错(急)
strcmp只能对char类型的数组,而不能处理string类型,不能混淆着使用string类型用string.compare函数

软件类课程实验指导内容简介
在计算机教学中,实践环节起着至关重要的作用,《软件类课程实验指导》对此进行了深入解析。它着重于引导学生通过上机实验,深化对数据结构、操作系统、数据库原理和编译原理等软件类课程的理解,提升他们的问题解决能力和专业技能。这些课程作为计算机专业的核心必修课程,理论与实践并重,往往在实验部分对学生...

编译原理实验,说明语句的词法分析器,做好用C++写,发送到邮箱1172312385...
你做白日梦吧?1000分也不会有人给你写:不信你到处提问试试,天下没有免费的午餐。

机械原理读书笔记3000
一、对实验原理有更深的理解 通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以...

软件工程需要学哪些课程
软件工程需要学哪些课程?回答如下:数学:高数、线代、离散、概率论 汇编语言、c、c++、数据结构、计算机组成原理、操作系统、编译原理、java、算法设计与分析、软件管理等课程。不同学校开的课程不一样。行业角度:首先是一些基本的编程语言。C、C++、Java作为入门,基本上每个人都会的,其中由于趋势,C和...

江山市17053826053: 编译原理词法分析 -
陶变日晒: 原发布者:我de身高180 词法分析***摘要:词法分析(lexicalanalysis)是计算机科学中将字符序列转换为单词(Token)序列的过程.进行词法分析的程序或者函数叫作词法分析器(Lexicalanalyzer,简称Lexer),也叫扫描器(Scanner)....

江山市17053826053: 编译原理里的词法分析有什么功能?
陶变日晒: 词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号).词法分析程序实现这个任务.词法分析程序可以使用lex等工具自动生成.

江山市17053826053: 求编译原理的词法分析器源码 -
陶变日晒: /* 我上编译原理课时的第一次作业就是这个,flex源码. */%{#include<math.h> int num_lines=0;%} DIGIT [0-9] ID [a-zA-Z_][a-zA-Z0-9]*%%"#include" { printf("<包含头文件,请手动合并文件\\>\n"); fprintf(yyout,"<包含头文件,请手动合并...

江山市17053826053: 编译原理的词法分析器(c++语言)实验总是出错(急) -
陶变日晒: strcmp只能对char类型的数组,而不能处理string类型,不能混淆着使用string类型用string.compare函数

江山市17053826053: C#怎么实现词法分析器
陶变日晒: using System; using System.Collections; using System.Windows.Forms; using System.Linq; using System.Text; namespace 词法分析 { class Program { static void Main(string[] args) { ArrayList al = new ArrayList(); Console.WriteLine("请输入关...

江山市17053826053: 求一个C语言词法分析器源代码
陶变日晒: 我有,这是这学期刚做的,#include#include#include#include#include#... {coutch=src[pos ];continue;}}else{coutste="";}ch=src[pos ];}return0;}还有运行效果图,和实验报...

江山市17053826053: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔 -
陶变日晒: 编译原理的实验要求我们用JFlex和JavaCUP来对语言进行分析处理,JavaCUP有一个User's Manual教你怎样做,上面还有一个简单的计算器作为例子,但一试之下,却发现那个例子有不少错误,结果改了我n久才完成~当然马上就决定写一篇博...

江山市17053826053: 编译原理 词法分析 -
陶变日晒: C语言词法分析器#include#include#include using namespace std; FILE *f; //定义一个文件变量 static int line = 1; //表示光标所在的行数 struct ID{ char *name; int count;}id[100];//用于存放ID号码 static int I = 0; //用于记录ID存放的数量 int ...

江山市17053826053: 急求!!!用C语言编写一个编译原理实验的简单优先分析法程序 -
陶变日晒: 编译原理IF条件语句的翻译程序设计—简单优先法、输出四元式通过设计、编制、调试一个条件语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析.具体做到以下几点:①对输入...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网