資源簡介
西安電子科技大學(xué)編譯原理大作業(yè),為簡單的函數(shù)繪圖語言編寫一個(gè)解釋器。該解釋器接受用繪圖語言編寫的源程序,經(jīng)過語法和語義分析后,直接將源程序所規(guī)定的圖形顯示在顯示屏(或顯示窗口)中。作業(yè)的目的是:通過自己動(dòng)手編寫解釋器,掌握語言翻譯,特別是語言識(shí)別的基本方法。
代碼片段和文件信息
//?-----------------------------?grammer.cpp?---------------------------------
//?語法分析器類的定義
#include?“grammer.h“
//?------------------------?通過詞法分析器接口get_token獲取一個(gè)記號(hào)-------
void?grammer_class::fetch_token()
{
token?=?lexical.get_token?()?;
if?(token.type?==?ERRTOKEN) syntax_error(1);
}
//?------------------------?匹配記號(hào)---------------------------
void?grammer_class::match_token?(enum?token_type?the_token)?
{
if?(token.type?!=?the_token)?syntax_error(2);
fetch_token();
}
//?------------------------?語法錯(cuò)誤處理--------------------------
void?grammer_class::syntax_error?(int?case_of)?
{
switch(case_of)
{ case?1: error_msg?(lexical.line_no“?非法記號(hào)?“?token.lexeme)?;
break;
case?2:?error_msg?(lexical.line_no?token.lexeme?“?不是預(yù)期記號(hào)“)?;
break;
}
}
//?------------------------?打印錯(cuò)誤信息---------------
void?grammer_class::error_msg(int?line?char?*descrip?char?*string)
{
cout?<“Line?No?“?< lexical.close_lexical();
exit(1);
}
//?------------------------?先序遍歷并打印表達(dá)式的語法樹----------
void?grammer_class::print_syntax_tree(tree_node_ptr?root?int?indent)
{
int temp;
for?(temp=1;?temp<=indent;?temp++)?
cout?<“ “; //?縮進(jìn)
switch(root->op_code) //?打印根節(jié)點(diǎn)
{ case?PLUS:??????cout?<“+“?< case?MINUS:?????cout?<“-“?< case?MUL:???????cout?<“*“?< case?DIV:???????cout?<“/“?< case?POWER:?????cout?<“**“?< case?FUNC:??????cout?<content.tag_func.math_func_ptr?< case?CONST_ID:??cout?<content.tag_const?< case?T:?????????cout?<“T“?< default:????????cout?<“非法的樹節(jié)點(diǎn)!“?< }
if(root->op_code?==?CONST_ID?||?root->op_code?==?T)?
return; //?葉子節(jié)點(diǎn)返回
if(root->op_code?==?FUNC) //?遞歸打印一個(gè)孩子的節(jié)點(diǎn)
print_syntax_tree(root->content.tag_func.childindent+1);
else //?遞歸打印兩個(gè)孩子的節(jié)點(diǎn)
{
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?<“打開文件錯(cuò)誤?!“?< return;
}
fetch_token(); //?獲取第一個(gè)記號(hào)
program(); //?遞歸下降分析
lexical.close_lexical(); //?關(guān)閉詞法分析器
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
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2020-05-20?09:57??HW\
?????目錄???????????0??2020-05-20?09:58??HW\HW\
?????目錄???????????0??2020-05-20?09:57??HW\HW\Gramma\
?????目錄???????????0??2020-05-20?09:57??HW\HW\Gramma\Debug\
?????文件??????589884??2019-12-19?09:41??HW\HW\Gramma\Debug\Gramma.exe
?????文件??????833652??2019-12-19?09:41??HW\HW\Gramma\Debug\Gramma.ilk
?????文件?????2042636??2019-12-18?19:35??HW\HW\Gramma\Debug\Gramma.pch
?????文件?????1377280??2019-12-18?19:36??HW\HW\Gramma\Debug\Gramma.pdb
?????文件??????186231??2018-12-07?10:01??HW\HW\Gramma\Debug\grammer.obj
?????文件???????20390??2019-12-19?09:41??HW\HW\Gramma\Debug\grammermain.obj
?????文件???????23657??2018-12-07?10:01??HW\HW\Gramma\Debug\lexical.obj
?????文件??????186026??2018-11-22?22:18??HW\HW\Gramma\Debug\parser.obj
?????文件???????20900??2018-11-29?21:41??HW\HW\Gramma\Debug\parsermain.obj
?????文件???????23579??2018-11-22?22:18??HW\HW\Gramma\Debug\scanner.obj
?????文件??????140288??2019-12-19?09:41??HW\HW\Gramma\Debug\vc60.idb
?????文件??????110592??2019-12-18?19:35??HW\HW\Gramma\Debug\vc60.pdb
?????文件????????4232??2018-12-02?21:55??HW\HW\Gramma\Gramma.dsp
?????文件?????????520??2018-11-22?22:09??HW\HW\Gramma\Gramma.dsw
?????文件???????66560??2019-12-19?09:43??HW\HW\Gramma\Gramma.ncb
?????文件???????49664??2019-12-19?09:43??HW\HW\Gramma\Gramma.opt
?????文件?????????801??2019-12-19?09:41??HW\HW\Gramma\Gramma.plg
?????文件???????10106??2018-12-07?10:01??HW\HW\Gramma\grammer.cpp
?????文件????????2476??2018-12-07?10:01??HW\HW\Gramma\grammer.h
?????文件?????????248??2018-12-07?11:14??HW\HW\Gramma\grammermain.cpp
?????文件????????4358??2018-12-07?10:01??HW\HW\Gramma\lexical.cpp
?????文件????????2571??2018-12-07?10:01??HW\HW\Gramma\lexical.h
?????文件?????????191??2018-11-22?17:20??HW\HW\Gramma\test.txt
?????文件?????????329??2018-11-22?21:58??HW\HW\Gramma\test1.txt
?????文件?????????254??2018-11-29?21:24??HW\HW\Gramma\test2.txt
?????文件?????????162??2018-12-07?09:33??HW\HW\Gramma\test6.txt
?????目錄???????????0??2020-05-20?09:57??HW\HW\Lexical\
............此處省略57個(gè)文件信息
- 上一篇:IEC61850測(cè)試工具
- 下一篇:數(shù)字和字母訓(xùn)練集
評(píng)論
共有 條評(píng)論