⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 心得.txt

📁 一个pascal编译器,其中编译模块是独立的,可以进行任何slr语法分析,这个编译器还在实现中,目前已经完成到生成中间文件.
💻 TXT
字号:
1. 对于随时可能需要中止的事情 使用异常是个很好的方式
2. enum的使用
	enum "type" {A=0, B, C};
	或者干脆
	enum {A=0, B, C};
	功能类似于#define
	
3. 默认参数在函数声明中使用 定义时不写

4. 如果写h文件
	在h中除了定义class意外还要把类的声明环境写好
	在cpp中 只包含类的运行环境即可

5. 如何在一个项目A中共享另一个项目B
	1 A在c\c++附加包括目录中添加项目B的路径
	2 更改B的配置类型为lib
	3 在A中的连接器附加库目录选择A的debug
	
6.  不能使用iterator遍历vector时对vector增减项目
	因为这样会使iterator无效
	可以用at方法遍历没有问题
	
7.   .的优先级比*高

8.   如何用new分配二维数组?
	方法一:int * a = new [m * n]
			use a[m * i + j] for index   错!!!!是 a[n * i + j]
	方法二:int ** a;
			a = new int*[m];
			for(int i = 0; i < m ;++i)
			{
				a[i] = new int[n];				
			}
			
			use a[i][j] for index

9.	现在遇到一项非常棘手的问题:
		在运行compareDeducers时 明明相等的东西确偏偏返回不相等
		在debug下没有问题 在compareDeducers中插入printf时也没有问题
		加Sleep 问题依旧 不知道为什么
		
	解决 一切问题出在vector上面
	在使用iterator遍历前,必须确保size>0 否则遍历d结果不可预料
	
10.	一个低级的问题 
	一个int a[m * n]的数组
	使用i,j定位是 a[i * m + j] 还是 a[i * n + j]?
	
11.	用记事本表达思想思考问题 比在纸上方便 现把问题想清楚再去写代码是必须的

//以上更新于2004 11 19
	
-------------
性能:
	1 变量函数名128
	2 支持//
	3 变量声明 逗号 空格均可
	4 参数声明 (逗号空格均可)
	5 program prog(input, output)
	6 函数可以重载
	

-------------

备忘录

	1 ok 做树的输出函数
	2 函数的只能调用他的孩子 孩子之间
	  增加forward关键字(有时间再做)
	  我需要做:
		ok 在填写函数名之前检查同名(孩子之间是否同名 孩子与父亲是否同名)
		
	3  演示时举
			函数同名的例子
			函数参数
			
	4	ok 重载: 函数名可以相同 每当遇到procedure id时,向后分析其参数个数
		先分析参数 然后将参数个数合成到函数名中 
		
	5	四元式
			pc
			gen4	(初步定为gen4(int type, int addrX, int addrY, int addrZ)
			struct QuadNion
			{
				int type,
				int addrX
				int addrY
				int addrZ
			};
			vector<QuadNion> quads;
			generateQuadsFile()
			char quadsFileName[1024]
			HANDLE hQuadsFile
			
			在处理begin之后,将pc值填入first4
		
	6	在读入非终结符时,最后检查是否有重名的
	
	7	加入// 如语法文件
	
	8   deducer中point的指向边界
	
	9	下一项工作:
			ok 为ProjectGraphUnit添加index
			ok 生成分析表 10:34~11:34
				2维表 2个 action goto 纵:图的结点数  横:终结符个数 + '\0' /非终结符个数
				如何生成?
					fromIndex = 0;
					对图中每一个结点pgui遍历
					{
						对该结点的产生式找出point为-1的产生式的index
						{
							复制 该产生式的一个副本 把point改为0 d
							如果 比较d deducers.at(0) 全等
							{
								action(fromIndex, '\0') = 999;
							}
							else
							{
								将action(fromIndex, *) = -index;
							}
						}
						对pgui每一个arch遍历
						{
							if(arch.word 终结符)
							{
								action(fromIndex, w.id) = arch.directIndex;
							}
							if(arch.word 非终结符)
							{
								goto(fromIndex, w.id) = arch.directIndex;
							}
						}
						fromIndex++;
					}
						
		ok	如何利用分析表解析?
				准备一个栈{状态,word}
				过来的是一串word
				分析程序是将栈与word根据分析表得到下一个状态 
				最终当word串结束后是否接受999
				
				首先 先把状态0压栈 word是什么不重要
				getword
				i = action(stack, word.id) ;
				if(i == 999)
				{
					return true;
				}
				else if(i > 0)
				{
					//push
					push(i,word);
				}
				else if(i < 0)
				{
					//i 代表产生式的编号
					l = 产生式i的长度
					退栈l次
					nextStack = goto(stack, -i);
					push(nextStack, deducers.at(-i).left);
				}
				else
				{
					error
				}
			
			在解析过程中遇到错误 应该是分析表出了问题 把它找出来!!!
			没错是分析表出了问题 主要错在 a[ i * m + j] 上
			当然还有不少其他的错误
			比如
				需要加maxid
				何时读取单词文件等等 我记不清了 反正不少
			
		下一项工作:
			使分析表和其他部分衔接起来
			需要完成:
				end 而不是 # 这个只需要把特殊处理#的部分去掉即可
				
						 
			
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -