一、实验内容和目的
已知待分析的C语言子集的语法,用EBNF表示如下:
<程序> f mai n() <语句块>
<语句块>f“” <语句串>“”
<语句串>f <语句>{;<语句>};
<语句>f <赋值语句>|<条件语句>|<循环语句>
<赋值语句>f ID = <表达式>
<条件语句>f if(条件)<语句块>
<循环语句>f while(<条件>)<语句块>
<条件> f <表达式 ><关系运算符 ><表达式>
<表达式>f <项>{ +<项>}|<项>{-<项>}
<项>f <因子>{*<因子>}|<因子>{/<因子>}
<因子 >f ID |NUM |(<表达式 >)
<关系运算符 >f<|<=|>|>=|==|!=
实验目的、要求实现的功能
实验目的: 编制一个语法分析程序, 实现对词法分析程序所提供的单词序列进行语法检查 和结构分析。
实验要求:在上机 (一)词法分析的基础上, 采用递归子程序法或其他适合的语法分析方法, 实现其语法分析程序。要求编译后能检查出语法错误。
将实验方法改写为适合 预测分析法 的文法如下:
<程序>f main()<语句块>
<语句块> f { <语句串>}
<语句串> f <语句 >; <语句串>
(3_1) <语句串>f £
<语句> f <赋值语句>
<语句> f <条件语句>
<语句> f <循环语句>
<赋值语句>fID= <表达式>
<条件语句> f if(<条件 >)<语句块>
<循环语句>fwhile(<条件>)<语句块>
<条件>f <表达式 ><关系运算符 ><表达式>
<表达式>f <项><表达式'>
(11_1) <表达式、>f+<项><表达式'>
(11_2) <表达式'>f -<项><表达式'>
(11_3) <表达式、>f £
<项>f <因子><项'>
(12_1) < 项、>f*v 因子 >< 项 '>
(12_2) < 项、>f/< 因子 >< 项 '>
(12_3) <项、>f £
< 因子 > f ID
< 因子 > f NUM
<因子>f (v表达式>)
<关系运算符 >f<
<关系运算符> f <=
<关系运算符> ->
<关系运算符>—>=
<关系运算符>—==
<关系运算符>—!=
4.求改写后文法的非终结符号的 FIRST集和FOLLOW集:
非终结符号
FIRST
FOLLOW
<程序>:
mai n
#
<语句块>
{
# ;
<语句串>
ID if while £
}
<语句>
ID if while
J
<赋值语句>
ID
J
<条件语句>
if
J
<循环语句>
while
J
<条件>
ID NUM (
)
<表达式>
ID NUM (
<<=>>===!=);
<表达式> :
+ - £
<<=>>===!=);
ID NUM (
+ -<<=>>===!=);
* / £
+ -<<=>>===!=);
<因子> :
ID NUM (
* /
<关系运算符>
<<=>>=== !=
ID NUM (
5.根据求得的FIRST集和FOLLOW集构造LL(1)分析表如下:
表格内空白的部分表示“出错”,非空白部分表示要压入分析栈中的文法符号,是按照对
应产生式的逆序存放的,即当查找分析表时,表格内的内容从左至右依次入栈
第3步中改写文法的LL(1)分析表
main
if
while
ID
NUM
(
)
{
}
+
-
*
/
<
< =
>
> =
==
!=
=
;
#
<程序>
)(main
<语句块>
}
<语句串>
{
<语句串>
<语句串 >; <语句>
£
<语句>
<条件语句>
<循环语句>
<赋值语句>
<赋值语
句>
<表达式>
=ID
<条件语
句>
<语句块>)
<条件>(if
<循环语
句>
<语句块 >) <条件>(while
<条件>
<表达式 >< 关系运算符 >< 表达式>
<表达式>
<表达式 '><项>
<表达式'>
£
<表达式'>
<项> +
<表达式'>
<项>-
£
£
£
£
£
£
£
<项'><因子>
£
£
£
*
/
£
£
£
£
£
£
£
<因子>
ID
NUM
) <表达式>(
<关系运算
符>
<
< =
>
> =
==
!=
二、所用仪器、材料(设备名称、型号、规格等)
操作系统:Microsoft Win dows 7
开发平台:Microsoft Visual Studio 2010
三、实验方法、步骤
登录Microsoft Windows 7操作系统
打开Visual Studio 2010开发平台
新建“项目”
“Win32控制台应用程序”
输入项目