资源简介
简单函数绘图语言的解释器,某电编译原理大作业,此代码测试环境为vc6,亲测完美运行。
代码片段和文件信息
// ----------------------------- grammer.cpp ---------------------------------
// 语法分析器类的定义
#include “grammer.h“
// ------------------------ 通过词法分析器接口get_token获取一个记号-------
void grammer_class::fetch_token()
{
token = lexical.get_token () ;
if (token.type == ERRTOKEN) syntax_error(1);
}
// ------------------------ 匹配记号---------------------------
void grammer_class::match_token (enum token_type the_token)
{
if (token.type != the_token) syntax_error(2);
fetch_token();
}
// ------------------------ 语法错误处理--------------------------
void grammer_class::syntax_error (int case_of)
{
switch(case_of)
{ case 1: error_msg (lexical.line_no“ 非法记号 “ token.lexeme) ;
break;
case 2: error_msg (lexical.line_no token.lexeme “ 不是预期记号“) ;
break;
}
}
// ------------------------ 打印错误信息---------------
void grammer_class::error_msg(int line char *descrip char *string)
{
cout << “Line No “ << line << “: “ << descrip << string << endl;
lexical.close_lexical();
exit(1);
}
// ------------------------ 先序遍历并打印表达式的语法树----------
void grammer_class::print_syntax_tree(tree_node_ptr root int indent)
{
int temp;
for (temp=1; temp<=indent; temp++)
cout << “ “; // 缩进
switch(root->op_code) // 打印根节点
{ case PLUS: cout << “+“ << endl; break;
case MINUS: cout << “-“ << endl; break;
case MUL: cout << “*“ << endl; break;
case DIV: cout << “/“ << endl; break;
case POWER: cout << “**“ << endl; break;
case FUNC: cout << root->content.tag_func.math_func_ptr << endl; break;
case CONST_ID: cout <content.tag_const << endl; break;
case T: cout << “T“ << endl; break;
default: cout << “非法的树节点!“ << endl; exit(0);
}
if(root->op_code == CONST_ID || root->op_code == T)
return; // 叶子节点返回
if(root->op_code == FUNC) // 递归打印一个孩子的节点
print_syntax_tree(root->content.tag_func.childindent+1);
else // 递归打印两个孩子的节点
{
print_syntax_tree(root->content.tag_op.left indent+1);
print_syntax_tree(root->content.tag_op.right indent+1);
}
}
// ------------------------ 绘图语言解释器入口(与主程序的外部接口)-----------
void grammer_class::grammer(char * file_name)
{
enter(“grammer“);
if(!(lexical.init_lexical(file_name))) // 初始化词法分析器
{
cout << “打开文件错误 !“ << endl;
return;
}
fetch_token(); // 获取第一个记号
program(); // 递归下降分析
lexical.close_lexical(); // 关闭词法分析器
back(“grammer“);
return;
}
// ------------------------ program 的递归子程序---------------------
void grammer_class::program ()
{
enter(“program“);
while (token.type != NONTOKEN)
{ statement();
match_token(SEMICO) ;
}
back(“program“);
}
// ------------------------ statement 的递归子程序---------------------
void grammer_class::statement()
{
enter(“statement“);
switch (token.type)
{ case ORIGIN : origin_statement(); break;
case SCALE : scale_statement(); break;
case ROT : rot_statement(); break;
cas
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-12-07 15:53 Gramma\Debug\
文件 589915 2018-12-07 15:53 Gramma\Debug\Gramma.exe
文件 843108 2018-12-07 15:53 Gramma\Debug\Gramma.ilk
文件 2018004 2018-12-07 10:01 Gramma\Debug\Gramma.pch
文件 1377280 2018-12-07 15:53 Gramma\Debug\Gramma.pdb
文件 186231 2018-12-07 10:01 Gramma\Debug\grammer.obj
文件 20679 2018-12-07 15:53 Gramma\Debug\grammermain.obj
文件 23657 2018-12-07 10:01 Gramma\Debug\lexical.obj
文件 186026 2018-11-22 22:18 Gramma\Debug\parser.obj
文件 20900 2018-11-29 21:41 Gramma\Debug\parsermain.obj
文件 23579 2018-11-22 22:18 Gramma\Debug\scanner.obj
文件 107520 2018-12-07 16:03 Gramma\Debug\vc60.idb
文件 110592 2018-12-07 15:53 Gramma\Debug\vc60.pdb
文件 4232 2018-12-02 21:55 Gramma\Gramma.dsp
文件 520 2018-11-22 22:09 Gramma\Gramma.dsw
文件 66560 2018-12-07 16:36 Gramma\Gramma.ncb
文件 49664 2018-12-07 16:36 Gramma\Gramma.opt
文件 1362 2018-12-07 15:53 Gramma\Gramma.plg
文件 10106 2018-12-07 10:01 Gramma\grammer.cpp
文件 2476 2018-12-07 10:01 Gramma\grammer.h
文件 248 2018-12-07 11:14 Gramma\grammermain.cpp
文件 4358 2018-12-07 10:01 Gramma\lexical.cpp
文件 2571 2018-12-07 10:01 Gramma\lexical.h
文件 191 2018-11-22 17:20 Gramma\test.txt
文件 329 2018-11-22 21:58 Gramma\test1.txt
文件 254 2018-11-29 21:24 Gramma\test2.txt
文件 162 2018-12-07 09:33 Gramma\test6.txt
目录 0 2018-12-07 09:31 Lexical\Debug\
文件 303197 2018-12-07 09:31 Lexical\Debug\Lexical.exe
文件 511544 2018-12-07 09:31 Lexical\Debug\Lexical.ilk
文件 23539 2018-12-06 17:13 Lexical\Debug\lexical.obj
............此处省略50个文件信息
- 上一篇:MFC C++英汉词典
- 下一篇:epson 热敏打印机 打印 源码
相关资源
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- C语言实现一个编译器-编译原理南开大
- 编译原理课程实验报告词法分析器及
- 编译原理与技术李文生:LR分析法C+
- C语言简化编译器前端 编译原理 LR1
- C-Minus编译器 编译原理实验
- LL1文法
- 现代编译原理C语言描述-高清-完整目
- TINY扩充语言的语法分析(实现 while、
- 编译原理课程设计词法语法分析器
- 编译原理课程设计整个项目和报告
- 编译原理LL1语法分析器C++版源代码
- 编译原理之算符优先算法-迭代法
- 编译原理词法分析器实验报告含源代
- 编译原理词法分析器C++版源代码
- 现代编译原理-c语言描述虎书
- 合工大编译原理实验报告
- LL1文法消除左递归编译原理mfc实现完
- 南邮编译原理实验
评论
共有 条评论