编译原理实验

Riicarus大约 2 分钟计算机科学编译原理编译原理实验

编译原理实验

词法分析

语法分析

语法

{S→S′S′→begin  DT  ;  ET  endDT→D∣DT  ;  DD→VD∣FDVD→integer  VV→IFD→integer  function  I(A)  ;FBA→VFB→begin  DT  ;  ET  endET→E∣ET  ;  EE→ER∣EW∣EA∣ECER→read(V)EW→write(V)EA→V  :=  AEAE→AE  −  IT∣ITIT→IT  ∗  FA∣FAFA→V∣C∣FEFE→I(V)EC→if  CE  then  E  else  ECE→AE  SR  AESR→<∣<=∣>∣>=∣=∣<> \left\{ \begin{array}{l} S \to S' \\ S' \to begin \; D_T \; ; \; E_T \; end \\ D_T \to D \mid D_T \; ; \; D \\ D \to V_D \mid F_D \\ V_D \to integer \; V \\ V \to I \\ F_D \to integer \; function \; I (A) \; ; F_B \\ A \to V \\ F_B \to begin \; D_T \; ; \; E_T \; end \\ E_T \to E \mid E_T \; ; \; E \\ E \to E_R \mid E_W \mid E_A \mid E_C \\ E_R \to read(V) \\ E_W \to write(V) \\ E_A \to V \; := \; A_E \\ A_E \to A_E \; - \; I_T \mid I_T \\ I_T \to I_T \; * \; F_A \mid F_A \\ F_A \to V \mid C \mid F_E \\ F_E \to I(V) \\ E_C \to if \; C_E \; then \; E \; else \; E \\ C_E \to A_E \; S_R \; A_E \\ S_R \to < \mid <= \mid > \mid >= \mid = \mid <> \\ \end{array} \right.

SS: 程序 S′S': 分程序 DTD_T: 说明语句表 ETE_T: 执行语句表 DD: 说明语句 VDV_D: 变量说明 FDF_D: 函数说明 VV: 变量 II: 标识符 AA: 参数 FBF_B: 函数体 EE: 执行语句 ERE_R: 读语句 EWE_W: 写语句 EAE_A: 赋值语句 ECE_C: 条件语句 AEA_E: 算数表达式 ITI_T: 项 FAF_A: 因子 FEF_E: 函数调用 CEC_E: 条件表达式 SRS_R: 关系运算符

左递归消除

有左递归的语句:

{DT→D∣DT  ;  DET→E∣ET  ;  EIT→IT  ∗  FA∣FAAE→AE  −  IT∣IT \left\{ \begin{array}{l} D_T \to D \mid D_T \; ; \; D \\ E_T \to E \mid E_T \; ; \; E \\ I_T \to I_T \; * \; F_A \mid F_A \\ A_E \to A_E \; - \; I_T \mid I_T \\ \end{array} \right.

消除左递归:

DT→DT  ;  D∣D==>{DT→D  DT′DT′→;D  DT′∣ϵ D_T \to D_T \; ; \; D \mid D ==> \left\{ \begin{array}{l} D_T \to D \; D_T' \\ D_T' \to ; D \; D_T' \mid \epsilon \\ \end{array} \right.

ET→ET  ;E∣E==>{ET→E  ET′ET′→;E  ET′∣ϵ E_T \to E_T \; ; E \mid E ==> \left\{ \begin{array}{l} E_T \to E \; E_T' \\ E_T' \to ; E \; E_T' \mid \epsilon \\ \end{array} \right.

I→I  ∗  FA∣FA==>{IT→FA  IT′IT′→∗FA  IT′∣ϵ I \to I \; * \; F_A \mid F_A ==> \left\{ \begin{array}{l} I_T \to F_A \; I_T' \\ I_T' \to * F_A \; I_T' \mid \epsilon \\ \end{array} \right.

AE→AE  −  IT∣IT==>{AE→IT  AE′AE′→−IT  AE′∣ϵ A_E \to A_E \; - \; I_T \mid I_T ==> \left\{ \begin{array}{l} A_E \to I_T \; A_E' \\ A_E' \to - I_T \; A_E' \mid \epsilon \\ \end{array} \right.

消除后结果

{S→S′S′→begin  DT  ;  ET  endDT→D  DT′DT′→;D  DT′∣ϵD→VD∣FDVD→integer  VV→IFD→integer  function  I(A)  ;FBA→VFB→begin  DT  ;  ET  endET→E  ET′ET′→;E  ET′∣ϵE→ER∣EW∣EA∣ECER→read(V)EW→write(V)EA→V  :=  AEAE→IT  AE′AE′→−IT  AE′∣ϵIT→FA  IT′IT′→∗FA  IT′∣ϵFA→V∣C∣FEFE→I(AE)EC→if  CE  then  E  else  ECE→AE  SR  AESR→<∣<=∣>∣>=∣=∣<> \left\{ \begin{array}{l} S \to S' \\ S' \to begin \; D_T \; ; \; E_T \; end \\ D_T \to D \; D_T' \\ D_T' \to ; D \; D_T' \mid \epsilon \\ D \to V_D \mid F_D \\ V_D \to integer \; V \\ V \to I \\ F_D \to integer \; function \; I (A) \; ; F_B \\ A \to V \\ F_B \to begin \; D_T \; ; \; E_T \; end \\ E_T \to E \; E_T' \\ E_T' \to ; E \; E_T' \mid \epsilon \\ E \to E_R \mid E_W \mid E_A \mid E_C \\ E_R \to read(V) \\ E_W \to write(V) \\ E_A \to V \; := \; A_E \\ A_E \to I_T \; A_E' \\ A_E' \to - I_T \; A_E' \mid \epsilon \\ I_T \to F_A \; I_T' \\ I_T' \to * F_A \; I_T' \mid \epsilon \\ F_A \to V \mid C \mid F_E \\ F_E \to I(A_E) \\ E_C \to if \; C_E \; then \; E \; else \; E \\ C_E \to A_E \; S_R \; A_E \\ S_R \to < \mid <= \mid > \mid >= \mid = \mid <> \\ \end{array} \right.