文档介绍:DO-WHILE语句的翻译程序设计
1)写出符合递归下降法的文法及属性文法。
2)完成题目要求的中间代码四元式的描述。
3)写出递归下降法的思想,完成语法分析和语义分析程序。
4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
5)递归下降法是语法分析中最易懂的一种方法,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。
6)单词的编码
单词
编码
do
3
while
2
数字
7
+
9
=
8
<
11
>
12
(
13
)
14
:
<cycle> do <sentence_str>while <expression>
<sentence_str> id=<expression>
<expression> <term>|<term><expression>
<term> <facter>|<facter><term>
<facter> id| <rela_express>
<rela_express> <expression><relation><expression>
<relation> <|>|=
:
产生式: Sàdo S1 while E
:=newlabel;
:= newlabel;
:=;
:=;
:=gen(’:’)////gene(’:’)//
//’gen(goto’ )
采用了递归子程序方法进行语法分析,对文法中的每个非终极符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。每次进入子程序之前都预先读入一个单词。因为使用了递归下降方法,所以程序结构和层次清晰明了,易于手工实现,且时空效率较高。实际的语法分析工作,从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。
代码中间用四元式的形式记录,四元式是带有四个域的记录结构,使用变量名字本身表示运算对象ARG1和ARG2,用ti表示RESULT。在实际实现中,它们或者是一个指针,指向符号表的某一登录项,或者是一个临时变量的整数码。在对赋值语句翻译为四元式的描述中,我们将表明怎样查找这样的符号表登录项。,用做语义变量,用Lookup(),如在,则返回一指向该登录项的指针,否则返回nil。
采用了递归子程序方法进行语法分析,对文法中的每个非终极符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。每次进入子程序之前都预先读入一个单词。因为使用了递归下降方法,所以程序结构和层次清晰明了,易于手工实现,且时空效率较高。实际的语法分析工作,从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。
// 匹配一个符号token...
void match(token)
{
    if (current_token == token) current_token = get_next_token();
    else error("expect {token}, but give {current_token}")
}
// function_decl 用来匹配一个函数声明语句;
// function_decl 的产生式为:
// function_decl := function func_name ( argment_list );
void function_decl( )
{
    current_token = get_next_token();   // 取出一个符号
    match(function);   // 匹配function
    func_name();       // 如果已经匹配,那么接下来应该匹配函数名字了
    match('(');            // 匹配'(