目的和内容
1、 实验目的:通过完成语法分析程序,了解语法分析的过程和作用 2、 实验内容:用递归子程序法实现对pascal的子集程序设计语言的分析程序 3、 实验要求:对源程序的内码流进行分析,如为文法定义的句子输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用
文法的改变
为适合递归子程序法,对实验一中的文法改写成无左递归和无左共因子的BNF如下: <程序>→<程序首部><分程序>. <程序首部>→PROGRAM标识符; <分程序>→<常量说明部分><变量说明部分><过程说明部分> <复合语句> <常量说明部>→CONST<常量定义><常量定义后缀> |ε <常量定义>→标识符=无符号整数 <常量定义后缀>→,<常量定义><常量定义后缀> |ε <变量说明部分>→VAR<变量定义><变量定义后缀> |ε <变量定义>→标识符<标识符后缀>:<类型>; <标识符后缀>→,标识符<标识符后缀> |ε <变量定义后缀>→<变量定义><变量定义后缀> |ε <类型>→INTEGER | LONG <过程说明部分>→<过程首部><分程序>;<过程说明部分后缀>|ε <过程首部>→PROCEDURE标识符<参数部分>; <参数部分>→(标识符: <类型>)|ε <过程说明部分后缀>→<过程首部><分程序>;<过程说明部分后缀>|ε <语句>→<赋值或调用语句>|<条件语句>|<当型循环语句>|<读语句> |<写语句>|<复合语句>|ε <赋值或调用语句>→标识符<后缀> <后缀>→:=<表达式>|(<表达式>)|ε <条件语句>→IF<条件>THEN<语句> <当型循环语句>→WHILE<条件>DO <语句> <读语句>→READ(标识符<标识符后缀>) <写语句>→WRITE(<表达式><表达式后缀>) <表达式后缀>→,<表过式><表达式后缀>|ε <复合语句>→BEGIN<语句><语句后缀>END <语句后缀>→;<语句><语句后缀>|ε <条件>→<表达式><关系运算符><表达式>|ODD<表达式> <表达式>→+<项><项后缀>|-<项><项后缀>|<项><项后缀> <项后缀>→<加型运算符><项><项后缀>|ε <项>→<因子><因子后缀> <因子后缀>→<乘型运算符><因子><因子后缀>|e <因子>→标识符|无符号整数|(<表达式>) <加型运算符>→+|- <乘型运算型>→*|/ <关系运算符>→ =|<>|<|<=|>|>=
非终结符和函数名对照表
为适用递归子程序,下表为非终结符和函数名对照表
非终结符 | 函数名 | 非终结符 | 函数名 | <程序> | program | <程序首部> | proghead | <分程序> | block | <常量说明部分> | consexpl | <常量定义> | consdefi | <变量说明部分> | varexl | <常量定义后缀> | conssuff | <变量定义> | vardefi | <变量定义后缀> | varsuff | <>过程说明部分> | procdefi | <类型> | typeil | <过程首部> | procedh | <过程说明部分后缀> | procsuff | <赋值或调用语句> | assipro | <语句> | sentence | <后缀> | suffix | <条件语句> | ifsent | <读语句> | read | <当型循环语句> | whilsent | <标识符后缀> | idsuff | <写语句> | Write | <复合语句> | compsent | <表达式后缀> | Exprsuff | <语句后缀> | sentsuff | <条件> | Conditio | <项后缀> | termsuff | <表达式> | Express | <项> | term | <因子后缀> | Factsuff | <参数部分> | argument | <因子> | Factor | <加型运算符> | addoper | <乘型运算符> | Muloper | <关系运算符> | respoper |
递归子程序的设计思想
为每个非终结符设计一个识别的子程序,寻找该非终结符也就是调用相应的子程序。由于单词在语法分析中作为一个整体,故在语法识别中仅使用其内码。在这里将词法分析作为语法分析的一个子程序,当语法分析需要单词时,就调用相应的词法分析程序获得一个单词。语法分析的作用是识别输入符号串是否是文法上定义的句子,即判断输入符号串是否是满足“程序”定义的要求。也就是当语法识别程序从正常退出表示输入符号串是正确的“程序”;若从出错退出,则输入符号串不是正确的“程序”。出错时,可以根据读字符的位置判断出错的位置。
实验流程
下面是部分子程序的流程图
实验代码
ing。。。
code here
实验结果
待分析代码
program main;
const x = 1, y=2,z=444;
var z,x:long;xx:long;
a:long;
begin
z := z*3/2;
read(xx,dsaf);
write(dsaf,xx);
if x > y
then
x := x+1;
begin
x := x+1;
y:= xx -12;
x := +123;
x := (1+2);
x:= 213 * 3 + 21/x;
y := y/2 +2;
begin
while x<=10
do
y:=y+1;
end
end
end.
以上代码只是单纯为了检测是否能够通过语法分析,并没有什么实际含义(o゜▽゜)o
语法分析检测通过!
|