(1)关键字
main, int, char, if, else, for, while, void
(2)运算符
= + - * / < <= > >= == !=
(3)界符
; ( ) { }
(4)标识符
ID = letter(letter|digit)*
(5)整型常数
NUM = digit digit*
(6)空格
‘ ‘ ‘\n’ ‘\r’ ‘\t’
空格用来分隔ID,NUM,运算符,界符和关键字
<程序> ::= main()<语句块>
<语句块> ::= ‘{’<语句串>‘}’
<语句串> ::= <语句>{;<语句>};
<语句> ::= <赋值语句> | <条件语句> | <循环语句>
<赋值语句> ::= ID=<表达式>
<条件语句> ::= if(<条件>) <语句块>
<循环语句> ::= while(<条件>) <语句块>
<条件> ::= <表达式><关系运算符><表达式>
<因子> ::= ID | NUM | (<表达式>)
<项> ::= <因子>{*<因子> | /<因子>}
<表达式> ::= <项>{+<项> | -<项>}
<关系运算符> ::= < | <= | > | >= | == | !=
递归下降语法分析
将语义子程序嵌入到每个递归过程中,通过递归子程序内部的局部量和参数传递语义信息。
在表达式分析函数和项分析函数中加入赋值语句语义分析程序,为每个子表达式和项生成四元式,在表达式分析函数中下一个读取到的符号仍然为‘+’或‘-’则生成临时变量存储计算结果并继续生成四元式,项分析函数中则读取到符号为‘*’或‘-’则继续生成四元式,算法与表达式分析函数同理。
在条件语句分析函数中加入if语句翻译处理,为if语句生成两条四元式,分别为条件成立的跳转和条件不成立的跳转四元式,这里应注意通过ntc、nfc、nNXQ变量记录真链、假链和下一条语句的生成式位置,先将nNXQ通过bp()函数回填到ntc所指四元式中,再在if语句语法分析的末尾将if语句的结束位置回填到nfc所指四元式中。
while语句翻译和if语句相似,但要注意while语句语法分析结束后的处理和if不同,因为while语句若条件继续成立就会继续执行,所以要在末尾多生成一个跳转四元式跳转回while的条件判断四元式。