已有的文法G(L):
主程序结构
L->main {DL; SL; PL;}
变量声明语句序列
DL->DD’
D’->;DD’|ε
D->T id
T->int | float | chars
赋值语句序列
SL->SS’
S’->;SS’|ε
S->id=E
计算表达式语句序列
E->TE’
E’->+TE’|-TE’|ε
T->FT’
T’->*FT’|/FT’|ε
F->变量 | 整常量 | 带小数点的常量 | ’字符’
输出语句序列
PL->PP’
P’->;PP’|ε
P->print id
语法分析(60分)
1. 使用词法分析种别编码表中各个运算符、变量和常量的种别编码替换掉文法G(L)中的各个运算符、变量和常量(如果有必要,其他的符号也可以用你认为方便的形式替换)
2. 构造改写后的文法的LL(1)预测分析表
以上两项要提交文档
3. 编写基于LL(1)文法的语法分析程序,利用预测分析表对词法分析的结果进行语法分析
语义分析(10分)
1. 对在声明语句定义了的变量,填入符号表(包括变量的名称和类型,类型可用种别编码表示),程序运行结束时,输出符号表中内容
符号表的格式
变量名 数据类型 值
2. 对在计算表达式中出现的变量:
1) 核实其曾在声明语句中声明过,否则报错;
2) 若运算符两边都是数值类型,实现该运算符基本运算操作;
3) 若‘+’运算符两边有一个或两个chars类型的变量,实现‘+’两边字符串的拼接操作;其他运算符两边出现chars类型变量时报错;
3. 对赋值语句,将赋值号‘=’右边的运算值填入到赋值号‘=’左边变量所对应的符号表行的值单元中,填入前检查数据类型是否正确,左右两边数据类型不一致时报错;
4. 对输出语句序列,输出print后的变量对应的值,按 变量名=变量值 的形式输出
示例程序
main{
int a;
chars s;
a=125*125;
s=’y’;
s=s+5;
print s;
print a;
}
1.词法分析
输出所有符号种别编码及属性值
2. 语法分析
输出“语法正确”
3. 语义分析
输出符号表
输出执行结果
s=y5
a=15625
主程序结构
L->main {DL; SL; PL;}
变量声明语句序列
DL->DD’
D’->;DD’|ε
D->T id
T->int | float | chars
赋值语句序列
SL->SS’
S’->;SS’|ε
S->id=E
计算表达式语句序列
E->TE’
E’->+TE’|-TE’|ε
T->FT’
T’->*FT’|/FT’|ε
F->变量 | 整常量 | 带小数点的常量 | ’字符’
输出语句序列
PL->PP’
P’->;PP’|ε
P->print id
语法分析(60分)
1. 使用词法分析种别编码表中各个运算符、变量和常量的种别编码替换掉文法G(L)中的各个运算符、变量和常量(如果有必要,其他的符号也可以用你认为方便的形式替换)
2. 构造改写后的文法的LL(1)预测分析表
以上两项要提交文档
3. 编写基于LL(1)文法的语法分析程序,利用预测分析表对词法分析的结果进行语法分析
语义分析(10分)
1. 对在声明语句定义了的变量,填入符号表(包括变量的名称和类型,类型可用种别编码表示),程序运行结束时,输出符号表中内容
符号表的格式
变量名 数据类型 值
2. 对在计算表达式中出现的变量:
1) 核实其曾在声明语句中声明过,否则报错;
2) 若运算符两边都是数值类型,实现该运算符基本运算操作;
3) 若‘+’运算符两边有一个或两个chars类型的变量,实现‘+’两边字符串的拼接操作;其他运算符两边出现chars类型变量时报错;
3. 对赋值语句,将赋值号‘=’右边的运算值填入到赋值号‘=’左边变量所对应的符号表行的值单元中,填入前检查数据类型是否正确,左右两边数据类型不一致时报错;
4. 对输出语句序列,输出print后的变量对应的值,按 变量名=变量值 的形式输出
示例程序
main{
int a;
chars s;
a=125*125;
s=’y’;
s=s+5;
print s;
print a;
}
1.词法分析
输出所有符号种别编码及属性值
2. 语法分析
输出“语法正确”
3. 语义分析
输出符号表
输出执行结果
s=y5
a=15625