本文章深入浅出地讲解了编译原理中的语法分析和预测分析方法,并提供了相关实现代码供读者学习参考。
预测分析与递归子程序都是自顶向下的解析方法,在此提供无回溯的及无左公因子的语言结构范例。一个不包含左递归且没有左公共因子的基础规范定义如下:
<程序> → <程序首部><分程序>.
<程序首部> → PROGRAM 标识符;
<分程序> → <常量说明部分><变量说明部分><过程说明部分><复合语句>;
<常量说明部分> → CONST<常量定义><常量定义后缀>; | ε (ε表示空串)
<常量定义> → 标识符 = 无符号整数;
<常量定义后缀> → , <常量定义><常量定义后缀>| ε (ε表示空串);
<变量说明部分> → VAR<变量定义><变量定义后缀>| ε (ε表示空串);
<变量定义> → 标识符<标识符后缀>: 类型;
<标识符后缀> → , 标识符 <标识符后缀>| ε (ε表示空串);
<变量定义后缀> → <变量定义><变量定义后缀>| ε (ε表示空串);
<类型> → INTEGER | LONG;
<过程说明部分> → <过程首部><分程序>; <过程说明部分后缀>| ε (ε表示空串);
<过程首部> → PROCEDURE 标识符 <参数部分>: ;
<参数部分> → (标识符: 类型) | ε (ε表示空串);
<过程说明部分后缀> → <过程首部><分程序>; <过程说明部分后缀>| ε (ε表示空串);
语句定义如下:
<语句> → <赋值或调用语句> | <条件语句> | <当型循环语句>|<读取语句>|<写入语句>|复合指令;
<赋值或调用语句> → 标识符 <后缀>;
<后缀>→ := 表达式| (表达式)| ε (ε表示空串);
<条件语句> → IF 条件 THEN 语句;
<当型循环语句> → WHILE 条件 DO 语句;
<读取语句> → READ(标识符 <标识符后缀>) ;
<写入语句>→ WRITE (表达式 <表达式后缀>) ;
<表达式后缀> → , 表达式 <表达式后缀>| ε (ε表示空串);
复合指令 → BEGIN 语句; <语句后缀>; END;
<语句后缀> → ; 语句; <语句后缀>| ε (ε表示空串);
条件定义如下:
<条件>→ 表达式 关系运算符 表达式 | ODD表达式;
表达式的构成规则为:
<表达式> → +项; 项后缀| -项; 项后缀| 项; 项后缀;
<加型运算符> → +|-
<乘型运算符> → *|/;
关系运算符包括 =, <>, <, ≤, >, ≥;
因子和其扩展:
<因子>→ 标识符 |无符号整数|(表达式);
<因子后缀>→ 乘型运算符; 因子; 因子后缀| ε (ε表示空串);
<项>; → <因子>; 因子后缀;
<项后缀>; → 加型运算符; 项; 项后缀| ε (ε表示空串);