本来编译原理是先走了一步,没想到几天没学,课程进度都赶上来了。
lalr是在lr1文法百合并同心项得到,就是合并了展望符度,而展望符是用来判断用哪个式知子归约冲突的,将展望符合并了,就是将可道归约的范围扩大了,但每次只能选一个正回确的式子归约。故lalr文法中相对于lr1产生了归约归约冲突答。
例如我现在要创造一个语言,我想创作一个LR文法类型的语言,怎么做?
1. 写出大致的文法
2. 消除规约错误
但是现在学的是,给你一个文法,看它有没有规约错误,如果有错误就不是。充其量学了LL文法的消除错误,对于bison来说,他是通过设定优先级实现的消除错误。
好,那么现在用前端技术做一个简单计算器恐怕是不难,我觉得准能成。
然后前端技术究竟能到什么地步,就往下看了。然后最好实现语言,然后做实验了。
如果自己能够独立完成C--的编译器的话,那么对LALR的理解就会更好,先完成C--,同时明白文法,然后做自己的。
每日一个知识点:
strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。该函数的返回值是返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。
在Unix系统下换行只有\n,MAC OS下只有\r,Windows下是\n\r, \r\n是出错的。换行是\n,回车是\r,Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。因此对于编译器来说,最好不要将回车算在里面。