语法分析小程序。简单判断赋值、条件、循环,代码块开始,结束
二、 实验要求
1.待分析的简单语言的语法
用扩充的EBNF表示如下:
<程序块>::= begin<语句>{;<语句>} end.
<语句>::= <赋值语句>|<条件语句>|<循环语句>
<赋值语句>::= IDENT:=<表达式>
<条件语句>::= if <条件>then <语句>
<循环语句>::= while <条件> do <语句>
<表达式>::= [+|-]<项>{(+|-)<项>}
<项>::= <因子>{(*|/)<因子>}
<因子>::= IDENT | NUMBER |‘(’<表达式>‘)’
<条件>::= <表达式><关系运算符><表达式>
<关系运算符>::= <>|=|<|<=|>|>=
2. 实验要求说明
输入单词串,以“.”结束,如果是文法正确的句子,则输出成功信息,否则输出失败信息,指出错误原因。需要系统地规划错误码。 例如:
输入 begina:=2*3 end.
输出 syntaxparses success!
输入 beginx=4 end.
输出 Error 11: 没有检测到赋值语句的:=符号
输入 beginx:=2;while x>0 do if x/2=0 then x:=(x/2) end.
输出 syntaxparses success!
3. 语法分析设计说明
采用递归下降分析程序。为每个非终结符编写一个子过程。
设计思路
1.变量说明
line 从终端读入的字符串;
p 当前所指位置在计数器,
ch 字符为
token 正在识别的单词字符串;
m 当前所指位置在计数器
num 整型常数
sym 每个单词符号种类
word 保留字表
Err 错误类型标记
flag 出错标记
2.函数说明
void getsym(); //判断输入字符类型
int block(); //程序快分析函数
void error(int i); //出错处理函数
void statement(); //语句处理函数
void expression(); //表达式处理函数
void term(); //项处理函数
void factor(); //因子处理函数
void condition(); //条件处理函数
void Relational_operator(); //表达式处理函数
void printSym(int i) //打印输入字符的类型
接下来举例说明几个重要函数
1).getsym()函数示意图
2).main()函数示意图
3)block()函数示意图
3).error()函数示意图
错误序号 |
出错原因 |
1 |
没有检测到语句期望begin符号 |
2 |
没有检测到赋值语句的 := 符号 |
3 |
没有检测到条件语句的 then 符号 |
4 |
没有检测到循环语句的 do 符号 |
5 |
错误的句子! |
6 |
你写了数字! |
7 |
没有检测到 '(' 的 ')' 符号 |