编译原理实验:miniC语⾔编译器
本来想写个好点的,然⽽实际做起来发现没有那么简单,我还是太天真了,所以只能做阉割版的。
=========================
写下去的时候发现原来的架构不太好,写着写着就没有思路了,设置想不起之前是怎么存的,于是觉得这样拖下去不如重写,写个⾼聚合低耦合的。
=========================
所有的代码都上传在github
201506081545 语法分析语法⽂本载⼊完成。
201506081607 语法分析VN,VT集合获得。
201506081949 语法分析能否推出$表完成。
201506082200 语法分析推出First集合完成。
终于超越了原先的进度。不容易啊。
201506091306 语法分析推出Follow集合完成。
了⼀万年的错误,终于发现之前的First集合就错了,然后⼀看竟然是语法少打了⼀个》符号.....
可见之前测试还是要细⼼啊。
201506091649 语法分析推出Select集合完成。
eclipse竟然出现了莫名其妙的错误,把所有东西重新打了⼀遍才好。还不能复制粘贴。shenmegui
201506091900 语法分析推出预测分析表完成。
惊闻体育考试已经错过,⽼师最后只答应给出勤分.....这不就是宣布我挂了吗....
201506092230 语法分析已经完成。已经能成功分析测试代码。
但是测试⾃⼰的代码出了问题,主要还是语法还不够完整。
201506100923 ⽂法修改完成。
201506172217 有时候蛮不服的吧,由于排在班级后半部分,⽼师根本看不到后半部分的同学。只能内⼼狂喊,我要做的⽐那些所谓
的“好学⽣”要好。我是要真正写⼀个编译器,是能够实际使⽤的,是有实际意义的。
201506180932 对语法分析进⾏修改,使其能⽣成语法树,通过语法树进⾏翻译就简单多了。
201506240957 语法树完成了!还有有⼈终于肯领我⼊新世界的⼤门了。可能⼤家都还在摸索中,但是未来还是美好的不是吗?
原始⽂法来⾃:
修改后的⽂法为:
【函数定义】》【单个函数闭包】
【单个函数闭包】》【单个函数】【单个函数闭包】
【单个函数闭包】》 $
【单个函数】》【修饰词闭包】【类型】【变量】 ( 【参数声明】 ) { 【函数块】 }
【单个函数】》 void 【变量】 ( 【参数声明】 ) { 【函数块】 }
【修饰词闭包】》【修饰词】【修饰词闭包】
【修饰词闭包】》 $
【修饰词】》 describe
【类型】》 type 【取地址】
【取地址】》【星号闭包】
【星号闭包】》【星号】【星号闭包】
【星号闭包】》 $
【星号】》 *
【变量】》【标志符】【数组下标】
【标志符】》 id
【数组下标】》 [ 【因式】 ]
【数组下标】》 $
【因式】》 ( 【表达式】 )
【因式】》【变量或函数调⽤】
【变量或函数调⽤】》【变量】【函数调⽤后缀】
【函数调⽤后缀】》 ( 【参数列表】 )
【函数调⽤后缀】》 $
【因式】》【数字】
【数字】》 digit
【表达式】》【因⼦】【项】
【因⼦】》【因式】【因式递归】
【因式递归】》 * 【因式】【因式递归】
【因式递归】》 / 【因式】【因式递归】
【因式递归】》 % 【因式】【因式递归】
【因式递归】》 $
【项】》 + 【因⼦】【项】
【项】》 - 【因⼦】【项】
【项】》 $
【参数声明】》【声明】【声明闭包】
【参数声明】》 $
【参数声明】》 void
【声明】》【修饰词闭包】【类型】【变量】【赋初值】
【赋初值】》 = 【右值】
【赋初值】》 $
【右值】》【表达式】
【右值】》 { 【多个数据】 }
【多个数据】》【数字】【数字闭包】
【数字闭包】》 , 【数字】【数字闭包】
【数字闭包】》 $
【声明闭包】》 , 【声明】【声明闭包】
【声明闭包】》 $
【函数块】》【声明语句闭包】【函数块闭包】
【声明语句闭包】》【声明语句】【声明语句闭包】
【声明语句闭包】》 $
【声明语句】》【声明】 ;
【函数块闭包】》【赋值函数】【函数块闭包】
【函数块闭包】》【for循环】【函数块闭包】
【函数块闭包】》【条件语句】【函数块闭包】
【函数块闭包】》【函数返回】【函数块闭包】
【函数块闭包】》 $
【赋值函数】》【变量】【赋值或函数调⽤】
【赋值或函数调⽤】》 = 【右值】 ;
【赋值或函数调⽤】》 ( 【参数列表】 ) ;
【参数列表】》【参数】【参数闭包】
【参数闭包】》 , 【参数】【参数闭包】
【参数闭包】》 $
【参数】》【标志符】
【参数】》【数字】
【参数】》【字符串】
【字符串】》 string
【for循环】》 for ( 【赋值函数】【逻辑表达式】 ; 【后缀表达式】 ) { 【函数块】 } 【多重逻辑表达式】》【逻辑表达式】【多重逻辑表达式递归】
【多重逻辑表达式递归】》【⾼级逻辑运算符】【逻辑表达式递归】
【多重逻辑表达式递归】》 $
【⾼级逻辑运算符】》 &&
【⾼级逻辑运算符】》 ||
【逻辑表达式递归】》【逻辑表达式】
【逻辑表达式递归】》 $
【逻辑表达式】》【表达式】【逻辑表达式后缀】
【逻辑表达式后缀】》【逻辑运算符】【表达式】
【逻辑表达式后缀】》 $
【逻辑运算符】》 <
【逻辑运算符】》 >
【逻辑运算符】》 ==
【逻辑运算符】》 !=
【逻辑运算符】》 >=
【逻辑运算符】》 <=
【后缀表达式】》【变量】【后缀运算符】
【后缀运算符】》 ++
【后缀运算符】》 --
【条件语句】》 if ( 【多重逻辑表达式】 ) { 【函数块】 } 【否则语句】
【否则语句】》 else { 【函数块】 }
【否则语句】》 $
【函数返回】》 return 【因式】 ;
测试代码:
void print(char* s){
vasm("OUT 2,s");
}
void println(char *s){
vasm("OUT 1,s");
}
int IsPrime(int n){
int i;
for (i = 2;i < n;i ++){
if (n % i == 0){
return 0;
}
}
return 1;
}
int main(void){
int n;
for (n = 3;n <= 100;n ++){
if (IsPrime(n)){
printf("%d\n",n);
}
}
return 0;
}
运⾏结果:
语法:
【函数定义】》【单个函数闭包】 | 【单个函数闭包】 void
【单个函数闭包】》【单个函数】【单个函数闭包】 | $
【单个函数】》【修饰词闭包】【类型】【变量】 ( 【参数声明】 ) { 【函数块】 } | void 【变量】 ( 【参数声明】 ) { 【函数块】 }【修饰词闭包】》【修饰词】【修饰词闭包】 | $
【修饰词】》 describe
【类型】》 type 【取地址】
【取地址】》【星号闭包】
【星号闭包】》【星号】【星号闭包】 | $
【星号】》 *
【变量】》【标志符】【数组下标】
【标志符】》 id
【数组下标】》 [ 【因式】 ] | $
【因式】》 ( 【表达式】 ) | 【变量或函数调⽤】 | 【数字】
【变量或函数调⽤】》【变量】【函数调⽤后缀】
【函数调⽤后缀】》 ( 【参数列表】 ) | $
【数字】》 digit
【表达式】》【因⼦】【项】
【因⼦】》【因式】【因式递归】
【因式递归】》 * 【因式】【因式递归】 | / 【因式】【因式递归】 | % 【因式】【因式递归】 | $
【项】》 + 【因⼦】【项】 | - 【因⼦】【项】 | $
【参数声明】》【声明】【声明闭包】 | $ | void
【声明】》【修饰词闭包】【类型】【变量】【赋初值】
【赋初值】》 = 【右值】 | $
【右值】》【表达式】 | { 【多个数据】 }
【多个数据】》【数字】【数字闭包】
【数字闭包】》 , 【数字】【数字闭包】 | $
【声明闭包】》 , 【声明】【声明闭包】 | $
【函数块】》【声明语句闭包】【函数块闭包】
【声明语句闭包】》【声明语句】【声明语句闭包】 | $
【声明语句】》【声明】 ;
【函数块闭包】》【赋值函数】【函数块闭包】 | 【for循环】【函数块闭包】 | 【条件语句】【函数块闭包】 | 【函数返回】【函数块闭包】 | $【赋值函数】》【变量】【赋值或函数调⽤】
【赋值或函数调⽤】》 = 【右值】 ; | ( 【参数列表】 ) ;
【参数列表】》【参数】【参数闭包】
【参数闭包】》 , 【参数】【参数闭包】 | $
【参数】》【标志符】 | 【数字】 | 【字符串】
【字符串】》 string
【for循环】》 for ( 【赋值函数】【逻辑表达式】 ; 【后缀表达式】 ) { 【函数块】 }
【多重逻辑表达式】》【逻辑表达式】【多重逻辑表达式递归】
【多重逻辑表达式递归】》【⾼级逻辑运算符】【逻辑表达式递归】 | $
【⾼级逻辑运算符】》 && | ||
【逻辑表达式递归】》【逻辑表达式】 | $
【逻辑表达式】》【表达式】【逻辑表达式后缀】
【逻辑表达式后缀】》【逻辑运算符】【表达式】 | $
【逻辑运算符】》 < | > | == | != | >= | <=
【后缀表达式】》【变量】【后缀运算符】
【后缀运算符】》 ++ | --
【条件语句】》 if ( 【多重逻辑表达式】 ) { 【函数块】 } 【否则语句】
【否则语句】》 else { 【函数块】 } | $
【函数返回】》 return 【因式】 ;
终结符:
&&
||
<=
string
for
type
else
id
[
]
if
c语言编译器在线编译闰年digit
==
++
--
void
$
%
(
)
*
+
,
-
/
{
describe
;
<
!
=
}
=
>
return
>=
⾮终结符:
【逻辑表达式递归】【单个函数闭包】
【参数闭包】
【项】
【声明】
【逻辑表达式后缀】【因式】
【逻辑运算符】
【数字】
【数字闭包】
【类型】
【条件语句】
【星号】
【后缀运算符】
【逻辑表达式】
【后缀表达式】
【字符串】
【函数定义】
【单个函数】
【表达式】
【声明语句】
【因⼦】
【声明闭包】
【for循环】
【修饰词闭包】
【修饰词】
【声明语句闭包】
【赋值或函数调⽤】【取地址】
【参数】
【变量或函数调⽤】【变量】
【函数返回】
【赋初值】
【⾼级逻辑运算符】【参数声明】
【参数列表】
【多重逻辑表达式递归】【函数调⽤后缀】
【函数块闭包】
【标志符】
【多个数据】
【右值】
【赋值函数】
【函数块】
【因式递归】
【星号闭包】
【否则语句】
【多重逻辑表达式】
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论