源码地址在此
规则如下:
程序 -> 声明 语句序列
声明 -> 声明 ; {声明 };
声明 -> 特殊类型 变量列表
类型限定器 -> 整 | 极 |串
变量列表 -> 识别器 {, 识别 }
语句序列 -> 语句 { ; 语句 }
语句 -> 如语句 | 重复语句 | 赋值语句 |读语句 | 写语句| 当语句
当语句 -> 当 极式 干 语句序列 结束
如语句 -> 如 极式 随后 语句序列 [异 语句序列] 结束
重复语句 -> 重复 语句序列 直到 极式
赋值语句 -> 标识符 := 式
读语句 -> 读 标识符
写语句 -> 写 式
式 -> 极式 | 串式
极式->或式
或式->和式 {或 和式}
和式->非式 {和 非式}
非式->非 式 | 真 | 假 | 比较式
比较式->算术式 比较操作 算术式
比较操作-> > | < | = | >= | <=
算术式->项 { 加操作 项}
加操作->+ | -
项->因子 {乘操作 因子}
乘操作-> * | /
因子-> (算术式) | 数字 | 标识符
串式 -> 串 |标识符
生成代码规则如下:
序列->S ; 序列1
S.下个=新标签
序列1.下个=序列.下个
序列.代码=S.代码 || 标签 S.下个||序列1.代码
序列->S S.下个=序列.下个; 序列.代码=S.代码
S->重复 序列 直到 E
S.开始 =新标签
序列.下个=新标签
E.真=S.下个;
E.假=S.开始;
S.代码=标签 S.开始 || 序列.代码 || 标签 序列.下个 || E.代码
S->如 E 随后 S1 结束
E.真=新标签;
E.假=S.下个
S1.下个=S.下个
S.代码=E.代码 || 生成(E.真) || S1.代码
S->如 E 随后 S1 异 S2 结束
E.真=新标签;
E.假=新标签
S1.下个=S.下个; S2.下个=S.下个;
S.代码=E.代码 || 生成(E.真) || S1.代码
生成('至',S.下个)
|| 生成(E.假 || S2.代码
S->当 E 干 S1 结束
S.开始=新标签
E.真=新标签
E.假=S.下个
S.下个=S.开始
S.代码=生成(S.开始)|| E.代码 || 生成(E.真)|| S.代码 || 生成('至' S.开始)
E->E1 或 E2
E1.真=E.真
E.假=新标签
E2.真=E.真
E2.假=E.假
E.代码=E1.代码 || 生成(E.假) || E.代码
E->E1 和 E2
E1.真=新标签
E1.假=E.假
E2.真=E.真
E2.假=E.假
E.代码=E1.代码 || en(E1.代码) || E2.代码
E->不 E1
E.真=E.假
E1.假=E.真
E.代码=E1.代码
E->(E1)
E1.真=E.真
E1.假=E.假
E.代码=E1.代码
E->标识1 相对操作 标识2
E.代码=生成('如' 标识1.名 相对操作 标识2.名
'至' E.真 || 生成('至' E.假)
E->假 E.代码=生成('至' E.假)
E->真 E.代码=生成('至' E.真)