Tiny语言语法分析器设计过程

合集下载

TINY词法分析编译程序的部分实现

TINY词法分析编译程序的部分实现

TINY编译程序的部分实现TINY的程序结构很简单,它在语法上与Ada或Pascal的语法相似:仅是一个由分号分隔开的语句序列。

另外,它既无过程也无声明。

所有的变量都是整型变量,通过对其赋值可较轻易地声明变量(类似FORTRAN或BASIC)。

它只有两个控制语句:if语句和repeat语句,这两个控制语句本身也可包含语句序列。

if语句有一个可选的else部分且必须由关键字end结束。

除此之外,read语句和write语句完成输入/输出。

在花括号中可以有注释,但注释不能嵌套。

TINY的表达式也局限于布尔表达式和整型算术表达式。

布尔表达式由对两个算术表达式的比较组成,比较使用<与=比较算符。

算术表达式可以包括整型常数、变量、参数以及4个整型算符+、-、*、/,此外还有一般的数学属性。

布尔表达式可能只作为测试出现在控制语句中——而没有布尔型变量、赋值或I/O。

虽然T I N Y缺少真正程序设计语言所需要的许多特征——过程、数组和浮点值,是一些较大的省略——但它足可以用来例证编译器的主要特征了。

TINY编译器简单说明TINY编译器包括以下的C文件,(为了包含而)把它的头文件放在左边,它的代码文件放在右边:globals.h main.cutil.h util.cscan.h scan.cparse.h parse.csymtab.h symtab.canalyze.h analyze.ccode.h code.ccgen.h cgen.c除了将main.c放在globals.h的前面之外,这些文件的源代码及其行号都按顺序列在附录B中了。

任何代码文件都包含了globals.h头文件,它包括了数据类型的定义和整个编译器均使用的全程变量。

main.c 文件包括运行编译器的主程序,它还分配和初始化全程变量。

其他的文件则包含了头/代码文件对、在头文件中给出了外部可用的函数原型以及在相关代码文件中的实现(包括静态局部函数)。

语法分析实验报告(1)

语法分析实验报告(1)

语法分析实验报告一.实验目的1. 在语法分析器原理学习和词法分析器实验基础上,自行实现一个高级语言语法分析器,通过实验能够把原理和实现方法应用到如描述语言语法分析等词法分析器的设计中去。

2. 利用c语言编制递归下降分析程序,并对简单语言进行语法分析。

二.实验原理1. 待分析的简单语言的语法:0.txt:ghy.txt2. TEST语法规则:(1)<program>::={<declaration_list><statement_list>}(2) <declaration_list>::=<declaration_list><declaration_stat>|ε(3) <declaration_stat>::=int ID;(4) <statement_list>::=<statement_list><statement>|ε(5)<statement>::=<if_stat>|<while_stat>|<for_stat>|<compound_stat>|<expression_stat>(6) <if_stat>::=if(<expression>)<statement>[else<statement>](7) <while_stat)::=while(<expr>)<statement>(8)<for_stat>::=for(<expression>;<expression>;<expression>)<statement>(9) <write_stat>::=write<expression>(10) <read_stat>::=read<ID>(11) <compound_stat>::={<statement_list>}(12) <expression_stat>::=<exxprssion>;|;(13) <expression>::=ID=<bool_expr>|<bool_expr>(14)<bool_expr>::=<additive_expr>|<additive_expr>(<|>|<=|>=|==|!=)<additive_expr >(15) <additive_expr>::=<term>{+|-)<term>}(16) <term>::=<factor>{*|/)<factor>)(17) <factor>::=(<expression>)|ID|NUM三.实验步骤:1.用VC++编辑、编译和运行教材P221~230的语法分析程序。

编译原理实验报告《ll(1)语法分析器构造》

编译原理实验报告《ll(1)语法分析器构造》

规则右部首符号是终结

.
.
{ first[r].append(1,a); break;// 添加并结束
}
if(U.find(P[i][j])!=string::npos)// 规则右部首符号是非终结符 ,形如 X:: =Y1Y2...Yk
{
s=U.find(P[i][ j]);
//cout<<P[i][ j]<<":\n";
arfa=beta=""; for( j=0;j<100&&P[j][0]!=' ';j++) {
if(P[ j][0]==U[i]) {
if(P[ j][4]==U[i])// 产生式 j 有左递归 {
flagg=1;
.
.
for(temp=5;P[j][temp]!=' ';temp++) arfa.append(1,P[
{
int i,j,r,s,tmp;
string* first=new string[n];
char a;
int step=100;// 最大推导步数
while(step--){
// cout<<"step"<<100-step<<endl;
for(i=0;i<k;i++)
{
//cout<<P[i]<<endl;
j][temp]);
if(P[ j+1][4]==U[i]) arfa.append("|");//

PL0语言语法分析器实验报告

PL0语言语法分析器实验报告

PL0语言语法分析器实验报告一、引言编译器是一种用于把高级语言程序转换成机器可执行代码的软件工具。

编译器由多个组件构成,其中语法分析器是编译器中的重要组成部分,其主要功能是对输入的源代码进行解析,并生成一个语法树。

本实验旨在通过使用BNF(巴科斯范式)描述PL0语言的语法规则,并通过实现PL0语言的语法分析器,来深入理解语法分析的原理和过程。

二、PL0语言的语法规则1.程序结构:<程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>2.常量说明部分:<常量说明部分> ::= const <常量定义> { , <常量定义> };<常量定义>::=<标识符>=<无符号整数>3.变量说明部分:<变量说明部分> ::= var <标识符> { , <标识符> };4.过程说明部分:<过程说明部分>::=<过程首部><分程序>;<过程首部> ::= procedure <标识符> ;5.语句:<语句> ::= <赋值语句> , <if语句> , <while语句> , <调用语句> , <复合语句> , <读语句> , <写语句> , <空><赋值语句>::=<标识符>:=<表达式><if语句> ::= if <条件> then <语句> else <语句><while语句> ::= while <条件> do <语句><调用语句> ::= call <标识符><复合语句> ::= begin <语句> { ; <语句> } end<读语句> ::= read ( <标识符> )<写语句> ::= write ( <表达式> )6.表达式:<表达式>::=[+,-]<项>{(+,-)<项>}<项>::=<因子>{(*,/)<因子>}<因子>::=<标识符>,<无符号整数>,(<表达式>)7.条件:<条件>::=<表达式><关系运算符><表达式><关系运算符>::==,<>,<,<=,>,>=三、PL0语言的语法分析器设计与实现1.设计思路本次实验中,我们将使用自顶向下的递归下降分析法,来对PL0语言进行语法分析。

实验5---语法分析器(自下而上):LR(1)分析法

实验5---语法分析器(自下而上):LR(1)分析法

实验5---语法分析器(自下而上):LR(1)分析法一、实验目的构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。

二、实验内容程序输入/输出示例(以下仅供参考):对下列文法,用LR(1)分析法对任意输入的符号串进行分析:(1)E->E+T(2)E->E—T(3)T->T*F(4)T->T/F(5)F-> (E)(6)F->i输出的格式如下:(1)LR(1)分析程序,编制人:姓名,学号,班级(2)输入一个以#结束的符号串(包括+—*/()i#):在此位置输入符号串(3)输出过程如下:3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。

同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照。

三、实验方法1.实验采用C++程序语言进行设计,文法写入程序中,用户可以自定义输入语句;2.实验开发工具为DEV C++。

四、实验步骤1.定义LR(1)分析法实验设计思想及算法①若ACTION[sm , ai] = s则将s移进状态栈,并把输入符号加入符号栈,则三元式变成为:(s0s1…sm s , #X1X2…Xm ai , ai+1…an#);②若ACTION[sm , ai] = rj则将第j个产生式A->β进行归约。

此时三元式变为(s0s1…sm-r s , #X1X2…Xm-rA , aiai+1…an#);③若ACTION[sm , ai]为“接收”,则三元式不再变化,变化过程终止,宣布分析成功;④若ACTION[sm , ai]为“报错”,则三元式的变化过程终止,报告错误。

2.定义语法构造的代码,与主代码分离,写为头文件LR.h。

3.编写主程序利用上文描述算法实现本实验要求。

五、实验结果1. 实验文法为程序既定的文法,写在头文件LR.h中,运行程序,用户可以自由输入测试语句。

10.Tiny词法分析器

10.Tiny词法分析器

– 通常在程序中分配一块缓冲区(分配字符串) 之后使用系统方法将文件内的内容读入该缓 冲区,之后分析里面的字符
TINY语言词法分析器实现
字符的读取

使用C语言读取
– 包含头文件 – 打开文件(当前程序与文件建立链接,得到文 件句柄) – 读取(根据句柄调用函数) – 关闭(根据句柄调用函数)
TINY语言词法分析器实现

几个变量的说明
– char tokenString[MAXTOKENLEN];存储单 词的内容,因为单词是由字符组成的,而且 字符是一个一个分析的,所以用一个指针指 向已经存了几个字符 – int tokenStringIndex=0; – 有时分析的字符不是单词,所以用一个变量 来标记当前分析的字符是单词的一部分。 – int save;
• char buf[LEN] • source.getline(buf,LEN-1)
– 判断文件读取是否结束 if(source.eof()) – 关闭文件 source.close();
TINY语言词法分析器实现
getNextChar函数实现
TINY语言词法分析器实现
getToken函数实现
TINY语言词法分析器实现
getToken函数实现,START状态
break;
TINY语言词法分析器实现
getToken函数实现,INCOMMENT状态
TINY语言词法分析器实现
getToken函数实现,INASSIGN状态
TINY语言词法分析器实现
getToken函数实现,INNUM状态
TINY语言词法分析器实现
getToken函数实现,INID状态
TINY语言词法分析器实现
getToken函数实现,其它状态

TINY部分源码分析报告

TINY部分源码分析报告TINY是一种简单的编程语言,用于教学目的。

它的语法规则非常简单,只有几个基本的关键字和语句。

在这篇报告中,我将对TINY的部分源码进行分析。

首先,让我们来看一下TINY的词法分析器部分的源码。

TINY的词法分析使用了一种基于有限自动机的方法。

源码中定义了几个关键字和运算符的正则表达式模式,并使用这些模式进行匹配。

如果匹配成功,就返回对应的记号。

接下来是语法分析器部分的源码。

TINY的语法分析使用了递归下降的方法。

源码中定义了几个非终结符的函数,每个函数对应语法中的一个产生式。

函数根据当前输入的记号,选择适当的产生式,并继续递归下降,直到匹配整个输入。

TINY的语法规则非常简单,只有if语句、while语句、表达式、赋值语句等几个基本的语法结构。

在语法分析器的源码中,每个函数都对应一个语法规则。

例如,函数parseStatement用于解析语句,它根据当前输入的记号,选择适当的产生式,例如if语句的产生式或赋值语句的产生式。

为了简化语法分析过程,TINY使用了LL(1)文法。

LL(1)文法是指,对于任意一个非终结符X和一个记号a,最多只有一个产生式可以选择。

这样可以使得语法分析过程更加简单和高效。

除了词法分析器和语法分析器,TINY还包括了一个解释器部分的源码。

解释器使用了递归下降的方法,根据语法分析的结果进行解释执行。

解释器遵循TINY的语义规则,例如执行赋值语句将变量的值更新为表达式的值。

总结起来,TINY是一种简单的编程语言,它的源码包括词法分析器、语法分析器和解释器部分。

词法分析器负责将源代码转化为记号序列,语法分析器负责根据记号序列生成抽象语法树,解释器负责执行抽象语法树中的操作。

TINY的源码采用了有限自动机和递归下降的方法,通过正则表达式模式和LL(1)文法来进行匹配和选择。

整个源码非常简洁,适合用于教学和学习。

词法分析程序的设计与实现

词法分析程序的设计与实现方法1:采用C作为实现语言,手工编制一.文法及状态转换图1.语言说明:C语言有以下记号及单词:(1)标识符:以字母开头的、后跟字母或数字组成的符号串。

(2)关键字:标识符集合的子集,该语言定义的关键字有32个,即auto,break,case,char,const,continue,default,do,double,else,enum, extern,float,for,goto,if,int,long,register,return,short,signed,static, sizeof,struct,switch,typedef ,union,unsigned ,void, volatile和while。

(3)无符号数:即常数。

(4)关系运算符:<,<=,==,>,>=,!=。

(5)逻辑运算符:&&、||、!。

(6)赋值号:=。

(7)标点符号:+、++、-、--、*、:、;、(、)、?、/、%、#、&、|、“”、,、.、{}、[]、_、^等(8)注释标记:以“/*”开始,以“*/”结束。

(9)单词符号间的分隔符:空格。

2.记号的正规文法:仅给出各种单词符号的文法产生式(1)标识符的文法id->letter ridrid->ε|letter rid|digit rid(2)无符号整数的文法digits->digit remainderremainder->ε|digit remainder(3)无符号数的文法num->digit num1num1->digit num1|. num2|E num4|εnum2->digit num3num3->digit num3|E num4|εnum4->+digits|-digits|digit num5digits->digit num5num5->digit num5|ε(4)关系运算符的文法relop-> <|<=|==|>|>=|!=(5)赋值号的文法assign_op->=(6)标点符号的文法special_symbol->+|-|*|%|#|^|(|)|{|}|[|]|:|;|”|?|/|,|.& (7)逻辑运算符的文法logic->&&| || | !(8)注释头符号的文法note->/starstar->*3.状态转换图其中,状态0是初始状态,若此时读入的符号是字母,则转换到状态1,进入标识符识别过程;如果读入的是数字,则转换到状态2,进入无符号数识别过程;……;若读入的符号是/,转换到状态11,再读入下一个符号,如果读入的符号是*,则转换到状态12,进入注释处理状态;如果在状态0读入的符号不是语言所定义的单词符号的开始字符,则转换到状态13,进入错误处理状态。

Tiny+编译器


10. true
false
or
and
not
int
bool
string
while
do
if
then
else
end
repeat
until
read
write
11. All keywords are reserved and must be written in lowcase
12. 2.
Special symbols are the following:
17.
Identifier is letter followed by letters and digits
18. NUM=digit digit*
19. STRING=' any character except ' '
20. A STRING is enclosed in brackets '…', any character except ' can appear in a
39. 12
read‐stmt
‐> read identifier
40. 13
write‐stmt
‐> write exp
41. 14
exp
‐> arithmetic‐exp | bool‐exp | string‐exp| comparison‐exp
42. 15
comparison‐exp ‐> arithmetic‐exp comparison‐op arithmetic‐exp
30. 3
decl
‐> type‐specifier varlist

语法分析器实验报告

词法分析器实验报告实验名称:语法分析器实验内容:利用LL(1)或LR(1)分析语句语法,判断其是否符合可识别语法。

学会根据状态变化、first、follow或归约转移思想构造状态分析表,利用堆栈对当前内容进行有效判断实验设计:1.实现功能可对一段包含加减乘除括号的赋值语句进行语法分析,其必须以$为终结符,语句间以;隔离,判断其是否符合语法规则,依次输出判断过程中所用到的产生式,并输出最终结论,若有错误可以报错并提示错误所在行数及原因2.实验步骤3.算法与数据结构a)LLtable:left记录产生式左端字符;right记录产生式右端字符;ln记录产生式右端字符长度Status:记录token分析情况Token:category,类型;value,具体内容b)根据LL(1)算法,手工构造分析表,并将内容用数组存储,便于查找c)先将当前语句的各token按序存储,当前处理语句最后一个token以#标记,作为输入流与产生式比较,堆栈中初始放入#,x,a为处理输入流中当前读头内容✓若top=a=‘#‘表示识别成功,退出分析程序✓若top=a!=‘#‘表示匹配,弹出栈顶符号,读头前进一个✓若top为i或n,但top!=a,出错,输出当前语句所在行,出错具体字符✓若top不为i或n,查预测分析表,若其中存放关于top产生式,则弹出top,将产生式右部自右向左压入栈内,输出该产生式,若其中没有产生式,出错,输出当前语句所在行,出错具体字符d)以;作为语句终结,每次遇到分号则处理之前语句并清空后预备下语句处理,当遇到$表示该段程序结束,停止继续处理4.分析表构造过程a)x->i=ee->e+t|e-t|tt->t*f|t/f|ff->(e)|i|nnote: i表示变量,n表示数字,!表示空串b)提取左公因子x->i=ee->ea|ta->+t|-tt->tb|fb->*f|/ff->(e)|i|nc)消除左递归x->i=ee->tcc->ac|!a->+t|-tt->fdd->bd|!b->*e|/ff->(e)|i|n5.类class parser{public:LLtable table[100][100]; //LL(1)表void scanner(); //扫描输入流中内容并分析parser(istream& in); //初始化,得到输入文件地址int getLine() const; //得到当前行数private:int match(); //分析语法stack <char> proStack; //分析堆栈void constructTable(); //建立LL(1)表int getRow(char ch); //取字符所在表中行int getCol(char ch); //取字符所在表中列istream* pstream; //输入流void insertToken(token& t); //插入当前tokenstatus getToken(token& t); //找到tokenint getChar(); //得到当前字符int peekChar(); //下一个字符void putBackChar(char ch); //将字符放回void skipChar(); //跳过当前字符void initialization(); //初始化堆栈等int line; //当前行数token tokens[1000]; //字符表int counter; //记录当前字符表使用范围}6.主要代码void parser::constructTable() //建立LL(1)表{for (int i=0;i<8;i++){for (int j=0;j<9;j++){table[i][j].left=' ';for (int k=0;k<3;k++)table[i][j].right[k]=' ';}}table[0][6].left='x';table[0][6].ln=3;table[0][6].right[0]='i';table[0][6].right[1]='=';table[0][6].right[2]='e';table[1][4].left='e';table[1][4].ln=2;table[1][4].right[0]='t';table[1][4].right[1]='c';table[1][6].left='e';table[1][6].ln=2;table[1][6].right[0]='t';table[1][6].right[1]='c';table[1][7].left='e';table[1][7].ln=2;table[1][7].right[0]='t';table[1][7].right[1]='c';table[2][0].left='c';table[2][0].ln=2;table[2][0].right[0]='a';table[2][0].right[1]='c';table[2][1].left='c';table[2][1].ln=2;table[2][1].right[0]='a';table[2][1].right[1]='c';table[2][5].left='c';table[2][5].ln=0;table[2][5].right[0]='!';table[2][8].left='c';table[2][8].ln=0;table[2][8].right[0]='!';table[3][0].left='a';table[3][0].ln=2;table[3][0].right[0]='+'; table[3][0].right[1]='t'; table[3][1].left='a';table[3][1].ln=2;table[3][1].right[0]='-'; table[3][1].right[1]='t'; table[4][4].left='t';table[4][4].ln=2;table[4][4].right[0]='f'; table[4][4].right[1]='d'; table[4][6].left='t';table[4][6].ln=2;table[4][6].right[0]='f'; table[4][6].right[1]='d'; table[4][7].left='t';table[4][7].ln=2;table[4][7].right[0]='f'; table[4][7].right[1]='d'; table[5][0].left='d';table[5][0].ln=0;table[5][0].right[0]='!'; table[5][1].left='d';table[5][1].ln=0;table[5][1].right[0]='!'; table[5][2].left='d';table[5][2].ln=2;table[5][2].right[0]='b'; table[5][2].right[1]='d'; table[5][3].left='d';table[5][3].ln=2;table[5][3].right[0]='b'; table[5][3].right[1]='d'; table[5][5].left='d';table[5][5].ln=0;table[5][5].right[0]='!'; table[5][8].left='d';table[5][8].ln=0;table[5][8].right[0]='!'; table[6][2].left='b';table[6][2].ln=2;table[6][2].right[0]='*'; table[6][2].right[1]='f'; table[6][3].left='b';table[6][3].ln=2;table[6][3].right[0]='/'; table[6][3].right[1]='f'; table[7][4].left='f';table[7][4].ln=3;table[7][4].right[0]='(';table[7][4].right[1]='e';table[7][4].right[2]=')';table[7][6].left='f';table[7][6].ln=1;table[7][6].right[0]='i';table[7][7].left='f';table[7][7].ln=1;table[7][7].right[0]='n';}int parser::match() //分析语法{ofstream ofs("out.txt",ios::app);char a;int i=0;for (int p=0;p<counter;p++){cout<<tokens[p].value;ofs<<tokens[p].value;}cout<<endl;ofs<<endl<<"ANALYSIS:"<<endl;while(1){if(tokens[i].category=='n' || tokens[i].category=='i')a=tokens[i].category;elsea=(tokens[i].value)[0];if(a==proStack.top()){if(a=='#'){cout<<"This is valid!"<<endl<<endl;ofs<<"This is valid!"<<endl<<endl;return 0;}else{proStack.pop();i++;}}else{if(proStack.top() =='n'|| proStack.top() =='i'){if(a!='#'){cout<<"ERROR(LINE "<<getLine()<<" ): "<<a<<" cannot be matched"<<endl;ofs<<"ERROR(LINE "<<getLine()<<" ): "<<a<<" cannot be matched"<<endl;}else{cout<<"ERROR(LINE "<<getLine()<<" ): Unexpected ending"<<endl;ofs<<"ERROR(LINE "<<getLine()<<" ): Unexpected ending"<<endl;}cout<<"This is invalid!"<<endl<<endl;ofs<<"This is invalid!"<<endl<<endl;return 0;}else{if((table[getRow(proStack.top())][getCol(a)]).left!=' '){char pst=proStack.top();int n=table[getRow(pst)][getCol(a)].ln;int k=0;ofs<<table[getRow(pst)][getCol(a)].left<<"->"<<table[getRow(pst)][getCol(a)].right[0]<<table[getRow(pst)][g etCol(a)].right[1]<<table[getRow(pst)][getCol(a)].right[2]<<endl;proStack.pop();while (n>0){//cout<<n<<" "<<table[getRow(pst)][getCol(a)].right[n-1]<<endl;proStack.push(table[getRow(pst)][getCol(a)].right[n-1]);n--;}}else{if(a!='#'){cout<<"ERROR(LINE "<<getLine()<<" ): "<<a<<" cannot be matched"<<endl;ofs<<"ERROR(LINE "<<getLine()<<" ): "<<a<<" cannot be matched"<<endl;}else{cout<<"ERROR(LINE "<<getLine()<<" ): Unexpected ending"<<endl;ofs<<"ERROR(LINE "<<getLine()<<" ): Unexpected ending"<<endl;}cout<<"This is invalid!"<<endl<<endl;ofs<<"This is invalid!"<<endl<<endl;return 0;}}}}}实验结果:●输入(in.txt)●输出1输出2(out.txt)实验总结:原本以为处理四则运算赋值将会很困难,但在使用LL(1)后发现,思路还是挺清晰简单的,但在实验过程中,由于LL(1)不能出现左递归和左公因子,不得不将其消除,原本简单的产生式一下变多了,而在产生式理解上也没有原来直观,不过其状态复杂度没有LR高,故仍选择该方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Tiny语言语法分析器设计过程1、创建空工程
运行Microsoft Visual C++ 6.0 File菜单下选择New:
弹出下面对话框:
选择Win32 Console Application,同时在Project Name下输入工程名字:ParserByHand
点击Ok按钮,弹出下面对话框:
不做任何选择,按照默认“An empty project”,直接点击Finish按钮,弹出下面对话框:
直接点击OK按钮,工程创建完毕。

2、添加文件
首先在windows环境下,把设计好的文件GLOBALS.H、MAIN.C、PARSE.C、PARSE.H、SCAN.C、SCAN.H、UTIL.C 和UTIL.H拷贝到ParserByHand工程下:
如图所示,选中Project菜单,选择下面Add To Project子菜单下面的Files子菜单:
点击后弹出对话框:
在左侧的工程文件列表中,可以清楚地看到这些文件:
编译生成可执行文件ParserByHand.exe在本工程的debug目录下:
录下:
4、验证运行结果
Windows环境下点击“开始”,选中其中的“运行(R)”
,弹出下面对话框,输入cmd命令:
直接回车或者点击OK按钮,进入命令行方式(控制台方式):
输入上图所示的类似命令,进入可执行程序所在目录。

在当前目录下输入命令:ParserByHand sample.tny,然后回车,
西安理工大学计算机学院软061班吴松华制作张发存指导则得到相应的运行结果:命令行窗口太小,只显示其中的一部分:
第 11 页共 11 页。

相关文档
最新文档