📄 心得.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 + -