
**********************************************
2011年2月-4月

    大三下半学期开学的这两个月闲的迷上弹钢琴了
都快把这个编译器忘光了.

**********************************************
保存时间:	2011年4月10日 晚上 9:30

版本:		v0.901

1 修改时间:2011年2月23日 晚上 10:07

  不需要RadASM就可以生成exe文件,主要改动PC80X86汇编器文件;

2 修改时间:2011年2月24日 上午 9:20

  添加了"编译并运行"和"运行"这两个按钮;

3 修改时间:2011年2月25日 下午 7:14

  添加了"编译并运行"和"运行"的菜单项和快捷键;

4 修改时间:2011年2月26日 上午 10:13

  修改了快捷按钮图标;

5 修改时间:2011年3月4日 上午 11:37

  在AddressList.cs中修改了Reset()函数:
  StaticMaxAddr[ i ] = UnitList.Get( i ).StartAddress - 1;
  原来是等于-1，这样没有静态变量定义时就有问题(测试摄像头程序时发现的);

  今天是我生日, 呵呵..
  买了一个数码相机和一千元的电子元件,希望今天能到..

6 修改时间:2011年3月4日 下午 6:17

  把PC80X86的汇编运算库中的eor改成xor(没有eor这个指令,记错了...);

7 修改时间:2011年3月5日 深夜 1:23

  把元件库和协助文档改成树型图; (深夜1点钟... 今天是那个女孩的生日,最近怪怪的 总想起..)

8 修改时间:2011年4月10日 晚上 9:30

  在standard.cs中的双目运算函数中添加指针变量的减法,PC80X86汇编中添加指针减法运算,
  但是AVR的指针减法没有考虑元素长度,默认是指向字节型的指针减法.

**********************************************
保存时间:	2011年5月20日 深夜 0点01分

1 修改时间:2011年4月10日 下午 3:13
  Macro.cs 中 eployMacro()增加了中断堆栈大小(预留100个)

**********************************************
保存时间:	2011年6月6日 下午 2点04分

1 修改时间:2011年6月6日 下午 2点04分
  语法树分析中可以定义元件嵌套,但是不支持嵌套函数,变量等访问;

**********************************************
保存时间:	2011年6月15日 下午 6点48分

可以引用嵌套的函数和变量,元件可有public,ref 等修饰符(实际忽略);

**********************************************
保存时间:	2011年6月24日 下午 5点54分

元件可以用连接器进行设置(ref关键字有效),函数和变量等暂时无法使用连接器;
修改主函数定义方式,不使用main,而是通过start修饰符指定某个函数为起始函数,起始函数所在的元件没有限制;

**********************************************
保存时间:	2011年6月27日 上午 9点23分

1 可以使用元件连接器, 系统自动包含根元件(除了base和code元件);
2 改进虚拟变量指定方式(去掉@符号,元件可嵌套多层引用);

3 题外话:这几天一直忙于找工作,发现自己还在弄这个编译器,有什么用啊?工作也用不到
  曾经想别弄了,把所有和这个编译器相关的东西全删了吧,然后好好学学C++ ASP Java这些正经的知识,
  毕竟还是生活要紧
  这几天自己的思想发生了很大的变化,....经常怀念小时候,小时侯想过现在吗?

**********************************************
保存时间:	2011年6月27日 下午 4点49分

修改时间:	2011年6月27日 上午 10点25分

1 修改ParseType中的GetType函数,处理元件名嵌套引用;
2 修改语法树定义,使变量类型中的元件名可以多层引用;

修改时间:	2011年6月27日 下午 4点49分

1 改了好多地方,在定义变量时可以使用嵌套元件名称;
2 改进了变量位引用的安全性,检查元件名是否有效,防止编译器异常;

**********************************************
保存时间:	2011年6月28日 上午 11点10分

把一些测试程序改成元件嵌套形式,把PC80X86的测试程序全部正常运行;
修改了虚拟变量写入和读出部分,使其能处理引用类型元件;

今天忽然感觉应该好好反思一下,以前不能上网时候编程效率还行,但是后来实验室能
上网了就天天聊QQ,上网玩,经常一天做不了什么.最近又上不了网了,忽然感觉自己
又回到从前那段沉迷编程的日子...

绝对不能再虚度光阴了...

**********************************************
保存时间:	2011年7月2日 晚上 8点42分

去掉了 #include 和 #cpu 伪指令,以后也避免添加伪指令;
增加了 using 语句处理文件包含,可以识别referlib和current两种基地址形式;
关于元件嵌套,迷茫了一个月,终于在今天想通了.
现在完成了关于元件嵌套的主体语法;

**********************************************
保存时间:	2011年7月11日 晚上 10点28分

修改时间:	2011年7月4日 晚上 9点53分

1 可以包含相同元件,在include.cs中去掉used判断;

2 下一步是把编译器改写成工程管理形式,不再以单个文件作为编译单元;

3 今天班长通知我又挂了一科<软件工程>,现在挂太多了,已经没有学位证了.  十多科,突破学校记录了
  下午又全班抽签分配实习的单位... 抽签分配??? 如此苍白的大学...

修改时间:	2011年7月11日 晚上 10点28分

主要修改成后缀为*.u的文件格式,刚刚增加工程式写法;
今天自己的u.IDE迎来了第二个用户,嘿嘿

**********************************************
保存时间:	2011年7月17日 上午 10点14分

修改时间:	2011年7月12日 晚上 10点15分

1 以工程为单位而不是以文件为单位进行编译(工程文件需手工编写),
  下一步是去掉MainForm中的ctext;

修改时间:	2011年7月13日 上午 8点47分

1 把近期文件列表的相关操作整理到一个类中;
2 设计了一个工程属性设置窗口;

修改时间:	2011年7月15日 下午 3点53分

1 基本完成工程式的编译了,可以通过对话框设置工程属性;
2 using语句的前缀改为sys_lib/user_lib/this_file/this_project;
3 改正了一些路径上的错误,基本可以进行项目式的开发了;

修改时间:	2011年7月17日 上午 9点33分

1 在工程列表, 元件库列表和帮助文档列表中加上了图标;
2 通过FlashBox显示异常信息,而不是通过把按钮禁用(当没有打开工程或文件时却执行相关操作);

**********************************************
保存时间:	2011年7月18日 深夜 0点46分

修改时间:	2011年7月18日 深夜 0点12分

  把接口类型从元件类型中分离出来,这样语法上更清楚了.但是这样要改写大量程序,感觉有点困难;
  整整修改了一个晚上,还有好多没有处理.不过这一步弄好后基本上就没有任何其他实质的困难了,
  所以努力尽快把这部分处理好.

  到北京工作这几天,感觉自己很不适应.不过坚持下来,希望以后会变好,..希望有高一点的工资,
  但是更希望能每天过的开心,做自己喜欢的事,... 希望以后的日子不会一直像现在这样,...

  赚的第一个月工资买个电钢琴,然后自己租房,从公司宿舍搬出去,开始独立生活,学着做饭...

**********************************************
保存时间:	2011年7月19日 深夜 0点31分

修改时间:	2011年7月18日 晚上 11点07分

1 刚才又改了好多代码,主要是把vdata类型从unit类型中分离出来,哎呀 太乱了...
  发现把元件名和成员名连接起来作为成员名字比较合适,至少很适合vdata自定义类型;
  其实如果好好考虑下结构体和枚举等,可能都要设置成这种格式,再推广到函数和静态变量...

修改时间:	2011年7月19日 深夜 0点20分

1 终于解决了一个重大的问题--把虚拟数据类型从元件类型中分离出来,已经测试通过;
  还有一些小小的问题,主要是基本没有错误防御,代码安全性很差,语法错误的程序会让编译器崩溃掉...
2 以后还是尽量早点睡吧,别太晚了. 明天去握奇公司生产部调试设备;

**********************************************
保存时间:	2011年7月20日 深夜 0点27分

修改时间:	2011年7月19日 晚上 11点01分

1 把MemberType补充完整(包括dll,callback等); 把链接类型元件的目标改为元件名,而不是索引;
  处理链接器时,不考虑右侧元件是否存在(因为连接器还没有分析完);

修改时间:	2011年7月20日 深夜 0点04分

  把链接类型的元件引用处理成递归分析,使它和普通元件的使用完全一致,可以任意嵌套引用;
  (以前只能引用表层的链接类型元件); 只是匆匆试验了几个例子,正常.. 还没有充分测试;
  到现在为止自己的编程语言主体上就基本弄好了,剩下的应该是一些小的问题了;

  白天在公司忙着研究工业伺服电机控制,晚上忙自己的编译器到深夜,但是还是感觉虚度了好多
  时间.. 今天在公司看设备,整整坐了一天,看着那些机械部件在电脑控制下不停地动,但是
  自己却没精打采,没有任何兴趣..想起小时候捡到一个手电筒都要拆开摆弄半天,看到大街上的
  拖拉机和大铲车总是忍不住停下来瞧个半天,还专门收集一大堆的机械零件摆弄玩,..
  但是现在面对着让小时候的自己着迷的东西,却一点感觉都没有,... 难道因为兴趣变成工作
  就不再有兴趣了吗?... 想到这些心里有点难受.    哎睡觉去...
  
**********************************************
保存时间:	2011年7月21日 深夜 0点02分

修改时间:	2011年7月20日 下午 2点55分

1 把虚拟变量类型改成可链接形式,把AVR仿真的所有程序都测试正确;
2 把接口类型 interface去掉了,依靠函数名的get_??和set_??识别接口并记录;
3 下一步是把结构体也改成可链接形式;

修改时间:	2011年7月20日 下午 4点32分

4 测试MP3程序时候,把selected_item放到FAT32里边就编译出错(元件嵌套分析错误),后来发现
  是变量定义相似导致最后返回时返回了第一个变量(index),实际应返回第二个变量(UnitIndex);
  这个问题是由于函数中没有及时限制局部变量作用域导致的,看一下有什么办法能避免这个问题;

导致出错的代码(解析元件嵌套函数,这个函数在for循环中还带有自身递归调用,非常容易乱):

public static int GetIndex( string Name )
{
	int index = GetDirectIndex( Name );
	if( index != -1 ) {
		if( NodeSet[ index ].RealRefType == MemberType.RealRefType.Real ) {
			return index;
		}
		else {
			return GetIndex( NodeSet[ index ].TargetMemberName );
		}
	}
	string[] Split = Name.Split( '.' );
	string BaseUnitName = Split[ 0 ];
	int UnitIndex = -1;
	for( int i = 1; i < Split.Length; ++i ) {
		BaseUnitName += "." + Split[ i ];
		UnitIndex = GetDirectIndex( BaseUnitName );
		if( UnitIndex == -1 ) {
			return UnitIndex;
		}
		if( NodeSet[ UnitIndex ].RealRefType == MemberType.RealRefType.link ) {
			BaseUnitName = NodeSet[ UnitIndex ].TargetMemberName;
			int Rindex = GetIndex( BaseUnitName );
			BaseUnitName = NodeSet[ Rindex ].UnitName;
		}
	}
	if( UnitIndex == -1 ) {
		return UnitIndex;
	}
	if( NodeSet[ UnitIndex ].RealRefType == MemberType.RealRefType.Real ) {
		return index; //!!!!!!!!!!!!!!!!!!!!!!!!注意,这里出错,应该返回UnitIndex;
	}
	else {
		return GetIndex( NodeSet[ UnitIndex ].TargetMemberName );
	}
}
修改时间:	2011年7月21日 深夜 0点01分

把元件名添加到结构体名称中,但是还是编译失败,明天还要好好看下;

**********************************************
保存时间:	2011年7月21日 晚上 8点53分

修改时间:	2011年7月21日 上午 10点37分

1 结构体名称包含元件名,已经可以运行;
2 可以引用链接类型元件中的结构体,但是还不能引用链接类型结构体;

修改时间:	2011年7月21日 上午 11点33分

3 函数名称包含元件名,可以运行;
4 可以引用链接类型的函数,引用函数的形参匹配没有考虑,直接连接到目标函数;

修改时间:	2011年7月21日 下午 1点39分

5 静态变量名称包含元件名,可以运行;
6 可以引用链接类型的静态变量,引用静态变量的类型没有考虑,直接连接到目标静态变量;

修改时间:	2011年7月21日 下午 2点24分

5 常量名称包含元件名,可以运行;
6 可以引用链接类型的常量,引用常量的值没有考虑,直接连接到目标常量;

现在编译器的源代码行数刚刚超过2万行,...

修改时间:	2011年7月21日 下午 4点17分

7 把函数和常量列表中的一些函数转移到节点中,在列表里只有基本函数;
8 把元件类型列表中的一些函数转移到节点中;
9 把结构类型列表中的一些函数转移到节点中;

10 把元件库按照功能形式整理下;把芯片的类名改成chip,原来是sfr;

**********************************************
保存时间:	2011年7月22日 深夜 0点13分

修改时间:	2011年7月21日 晚上 11点45分

1 程序改了一个晚上,终于解决错误提示的问题了,现在可以正确显示出错点,
  如果文件没有打开则会自动打开;如果已经打开则指向出错点;

2 添加了一个打开工程的菜单项;
  编译时保存所有打开的文件;

**********************************************
保存时间:	2011年7月22日 晚上 9点08分

修改时间:	2011年7月21日 下午 1点59分

1 中断函数的地址可以引用元件中的常量,而不必须是字面常量(立即数);
2 修改语法树部分,发现可以用空格缩进表示各个非终结词的层次关系;
  把解析成员引用的部分单独提取出来,用于连接器类型使用;
3 把vdata定义中的目标元件扩展为可以嵌套引用,原来只能单层标识符指定;
4 去掉&unit和&local,这样在函数内就不支持定义指向其他变量的引用变量了;

修改时间:	2011年7月21日 下午 2点33分

  把单目运算的括号提取出来,去掉(uint8)等, 修改Expression.cs中的 单目运算( int Index );

修改时间:	2011年7月21日 下午 4点13分

  把元件类型,结构体类型等连接形式扩展到定义之后即可引用,暂不支持常量和变量;

修改时间:	2011年7月21日 下午 4点44分

  把常量连接形式扩展到定义之后即可引用;下一步是处理变量的引用链接;
  变量的isOut属性在修改程序时弄错了,导致分配静态变量溢出(已经改正);

  今天发生一件让人难受的事(7.22),发现自己越来越偏离曾经的想法了,...
  也许是以前的自己太幼稚,一直认为有种生活方式, 可以快快乐乐过日子,...
  会有那样生活吗??...
  到底人能不能只安心于自己的小世界就可以心满意足地生活, 还是说,人必须要
  活在社会中, 就要...
  以前是这样认为的,但是现在渐渐发现,人一定要有所转变,去适应新的生活...
  也许自己逃避的和不愿去想的事情,其实可能很简单...

**********************************************
保存时间:	2011年7月23日 上午 10点59分

修改时间:	2011年7月22日 晚上 10点41分

  编译器的保护措施不好,经常DOWN掉.. 发现一定要把前端信息合法化,如ParseType中,
  保证解析到的类型是正确的(每个vdata类型都存在等),就能避免后面大量处理错误防御,
  比如刚才想到VarType中可能返回null,但是程序里没有防御,于是急忙加了一些,
  后来一想只要ParseType里检查过了,就不用防御了,万一有异常也可以在VarType里
  用MessageBox显示出来,而且不会轻易发生;

修改时间:	2011年7月23日 上午 10点55分

  把编译器的元件库修改了一下,调试带有LCD1602,DS1302和DS18B20的一个闹钟程序,OK
  
  关于以后的打算: 开学后还是一心考研吧, 社会不是自己想的这样...
  不是逃避现实,... 反正不要像以前那样幼稚了啊.
  
**********************************************
保存时间:	2011年7月24日 深夜 0点49分

修改时间:	2011年7月24日 ?点?分

  去掉start关键字,用system.entry代替; system为关键字,增加了系统配置这个成员;

修改时间:	2011年7月23日 下午 5点17分

  遇到一个让人无语的问题:以前把逻辑或运算的优先级放在+-*/%之后(和C语言兼容),
  写了一个DS18B20程序正常;后来把优先级换了一下,导致那个程序不对了,改正后如下:

	//温度转换
	uint16 temp = ds18b20.read_temperature();
	//读取小数部分
	uint8 temp_dot = (uint8)( temp & 0x000f );
	//读取整数部分
	uint8 temp_int = (uint8)( temp >> 4 );
	LED.data[ 3 ] = temp_int / 10;
	LED.data[ 4 ] = ( temp_int % 10 ) | 0b1000_0000;  //这里有问题,必须加上括号...
	LED.data[ 5 ] = temp_dot * 10 / 16;
	LED.data[ 7 ] = 0x0c;

  今晚上一个同事非要请我吃饭,说要拜我为师学编程, 嘿嘿.  
  
  今天听了一下午的基督教赞美诗歌曲,忽然感觉自己又回到以前在学校时去教会的情景..
  教会的电钢琴,讲经的老师,那些信教的学生...

修改时间:	2011年7月24日 深夜 0点44分

  刚才把常量数组的定义修改下,可以省略第一个项的大小,编译器自动计算,其他项省略
  时编译器给出错误提示;并且数组的大小可以用定义常量指定,而不必需是字面常量,如:

  unit config
  {
  	const uint8 length = 2;
  }
  [config.length][4] uint8 array = { 1, 2, 3, 4, 5, 6, 7, 8 };

  睡觉了...

**********************************************
保存时间:	2011年7月24日 晚上 10点21分

修改时间:	2011年7月24日 晚上 10点19分

  把CPU设置改成system.cpu = ???;把元件库完善了加上user等,命名按照规范的方式,
  包含什么元件,文件名就是什么;

**********************************************
保存时间:	2011年7月25日 深夜 1点43分

修改时间:	2011年7月25日 上午 10点14分

  把成员引用改成用"."分隔的形式,这样可以处理带有数字后缀的位变量引用形式(下一步修改);
  把Parse中的GetType里的获取基本变量名改成调用通用程序(GetMembername),这样程序简洁;

修改时间:	2011年7月25日 上午 10点35分

  修改了一个很关键的地方:在语法树的"分隔"中修改下面的程序:

	static ReturnMessage 分隔( ReturnMessage r, string[] Cut )
	{
		int TempIndex = Index;
		int TempLength = length;
		r = AssayWord( Cut[ 4 ] );
		if( !r.isRight ) {
			Index = TempIndex;
			length = TempLength;
			return r;
		}
		string result = r.result + " ";
		while( true ) {
			int ttTempIndex = Index;
			int ttTempLength = length;
			r = AssayWord( Cut[ 3 ] );
			if( !r.isRight ) {
				break;
			}
			result += r.result + " ";
			r = AssayWord( Cut[ 4 ] );
			
			//这里修改了,可以处理形如 A.B.3 形式的语法
			//(以前遇到这样的语法则会全部退回);
			if( !r.isRight ) {
				Index = ttTempIndex;
				length = ttTempLength;
				break;
			}
//			if( !r.isRight ) {
//				Index = TempIndex;
//				length = TempLength;
//				return r;
//			}
			result += r.result + " ";
		}
		result = result.TrimEnd( ' ' );
		result = Cut[ 0 ] + " " + result;
		int Name = AddNode( result.Split( ' ' ) );
		r.isRight = true;
		r.result = Name.ToString();
		return r;
	}

  修改了变量引用的定义方式,以前不能用"."连接,临时设定为"[]"的形式:
  bit SDA = chip.P1[0];
  bit SCL = chip.P1[1];

  刚才修改了编译器的语法解析部分,现在可以全部用"."进行指定,定义方式如下:
  bit SDA = chip.P1.0[bit];
  bit SCL = chip.P1.1[bit];

  其中后面的[bit]指定数据类型,默认为bit类型,可以省略,即也可以如下定义:
  bit SDA = chip.P1.0;
  bit SCL = chip.P1.1;

  但是对于其他类型则不能省略:
  uint16 data;
  uint8 data_low = data.0[uint8];	//data_low指向data的低位字节
  uint8 data_high = data.8[uint8];	//data_high指向data的高位字节

修改时间:	2011年7月25日 下午 1点32分

  把成员类型提取出来单独分析,包括 访问类型 和 引用类型; 还是按顺序定义,下一步是
  可以不按顺序定义(未做);
  
修改时间:	2011年7月25日 下午 1点44分

  现在可以任意顺序定义成员的属性了,如:
  public link uint8 data;
  link public uint8 data;

修改时间:	2011年7月25日 晚上 11点09分

  去掉了原先的着色方案,改成了用词法分析的结果进行着色的方式,速度很快,而且以后可以
  扩展成线程式着色;

修改时间:	2011年7月26日 深夜 1点43分

  修改了文本编辑器的设置界面,刚才试验了好多种文本配色方案,现在终于感觉不错了,睡觉去..

**********************************************
保存时间:	2011年7月27日 晚上 10点20分

修改时间:	2011年7月26日 下午 4点59分

  编写了一个带有托盘图标的windows程序测试编译器,把原先extend那些文件全部合并到windows.u
  中,这样用法就和别的开发环境差不多了.发现了一个重大的BUG:
  在回调函数给托盘图标添加快捷菜单时,

 	//回调函数
	callback uint32 WndProc( uint32 hWin, uint32 uMsg, uint32 wParam, uint32 lParam )
	{
		if( uMsg == windows.WM_CREATE ) {
			hPopupMenu = user32.CreatePopupMenu();
			user32.AppendMenu( hPopupMenu, windows.MF_STRING, IDM_RESTORE, "&Restore" );
			user32.AppendMenu( hPopupMenu, windows.MF_STRING, IDM_EXIT, "E&xit" );
			return 0;
		}
	}
  常量字符串直接出现在程序中就不正常,显示不出字母'E'来,而把这两个字符串定义成字符串常量
  在程序中引用就没问题,原来是常量字符串的解析有问题,字符串后缀要加一个0,但是字符串长度并没有
  相应加1,导致出错,下面是改正之后的编译器端程序(Strings.Length的值包含两个双引号):

Result += "0";

//设置字符数组地址并返回数组变量索引
VarNode v = new VarNode();
string vType = "[" + ( Strings.Length - SwitchCharNumber - 1 ) + "] code uint8";
v.SetStaticValue( "", vType, MemberType.VisitType.Private, MemberType.RealRefType.Real, false, Index );
v.Address = Result;

修改时间:	2011年7月27日 上午 11点20分

  把着色的那些if else判断改成了switch形式;

修改时间:	2011年7月27日 下午 7点06分

  在信息提取中处理了枚举类型的定义,现在可以在编译列表中显示程序中定义的枚举类型列表,
  但是现在还不能定义枚举类型的变量和运算;

修改时间:	2011年7月27日 下午 7点53分

  现在可以定义枚举类型的变量了,枚举类型可以使用连接器; 但是还不支持枚举类型的运算;

修改时间:	2011年7月28日 上午 9点29分

  把语法上的初始目录改成了"u", 并且特殊处理以 "u" 开始的元件引用;

修改时间:	2011年7月28日 上午 11点03分

  把解析成员列表和元件的部分提取出来,通过函数委托实现源程序解析代码的共用, OK
  把设置cpu和起始函数改写成了u.格式: u.cpu = mega32; u.entry = controller.engine;

修改时间:	2011年7月28日 中午 12点19分

  把cpu类型视为普通成员,通过u.cputype.***引用: u.cpu = u.cputype.mega32;

修改时间:	2011年7月28日 下午 6点07分

  把code引用改成u.code,但是和系统不兼容,因为u.code不存在;

修改时间:	2011年7月28日 晚上 8点00分

  把base和code都处理成普通类型,不再去掉前缀元件名了;处理base时候把base全部替换成了u.base,但是
  涉及到一些字符串移除操作的地方Type.Remove( 0, 6 )都改成了Type.Remove( 0, 8 ),哎特别容易错,
  发现自己没有一个好的编程习惯,以后编程序要按照一种规范的方式去写,而不要一拍脑袋就写代码那种;
  别的什么都不要去想,只要自己的程序能做到有效地封装性,就是说如果改变了程序的一个地方,那只要
  修改相应的接口,其他地方就都不受影响,这个才是编程的中心想法;

  最近一段时间,自己总是因为一些莫名其妙的想法困扰,...哎反正不知道要说些什么了....
  现在想,自己以后按照自己的想法去过日子,然后不要幼稚想些没用的东西,..不要像小孩一样..
  
**********************************************
保存时间:	2011年7月28日 晚上 11点46分

修改时间:	2011年7月28日 晚上 11点44分

  终于解决结构体的链接了,在结构体内部的结构体类型也可以链接,通过link关键字;

**********************************************
保存时间:	2011年7月29日 晚上 8点50分

修改时间:	2011年7月29日 上午 9点36分

  处理了枚举类型的运算,发现一个非常好的方法:把枚举类型视为一种新的基本类型,就像float一样,直到最后
  转换为汇编程序时才转换为uint32类型,这样枚举类型之间可以进行+-&|等运算,如:

  enum KEY
  {
	UP, DOWN, LEFT, RIGHT
  }
  enum KEY key = scan_keyboard();
  if( key == KEY.UP | KEY.DOWN ) {
	....
  }
  也就是说枚举常量之间和枚举变量之间可以进行普通整形变量的算术,逻辑等运算,但是不能和整形量混合运算;
  现在枚举类型可以进行链接,编译器能正确转换到原始枚举定义(任何成员都可以用link链接,这个特性非常好);
  下一步是处理枚举常量的转换;
  补充一句: 实现上面的关键就在于,编译器在内部把枚举类型表示成: enum:????,这样就和基本类型一致了,而
  像以前那样表示成enum ??? 就很麻烦了; enum:????是一个词,enum ???? 是两个词;
  也许结构体也应该这样处理....

修改时间:	2011年7月29日 下午 2点08分

  把枚举类型全部弄好了,在枚举的成员常量指定中可以指定自定义的常量:
  unit config
  {
  	public const uint8 UP = 34;
  }
  enum KEY
  {
  	UP = config.UP, DOWN, LEF, RIGHT
  }
  同时在定义结构体时候检查结构体的成员名,有同名成员时提示错误信息;

**********************************************
保存时间:	2011年7月30日 深夜 1点16分

修改时间:	2011年7月30日 深夜 1点13分

  增加了一种无地址的虚拟数据类型,可以用软件模拟某个端口,编译器转换成函数调用;
  通过一种方法解决了这种无地址数据的引用:只是形式上产生一个指针,但不生成代码:
  
  //对于没有地址的虚拟数据类型,一定不能有下面这个指令,会很麻烦的,还占据指令行;
  string VdataType = VarType.GetStoreType( Type );
  int VdataIndex = VdataList.GetIndex( VdataType );
  if( VdataList.Get( VdataIndex ).AddrType != null ) {
	AddIns( Code1.读取地址 + " " + ei + " " + VarIndex );
  }

**********************************************
保存时间:	2011年7月31日 中午 12点30分

修改时间:	2011年7月30日 深夜 2点17分

  改正了一个很纠结的错误,自己把 "!=" 写成 "==" 了, 对照汇编代码找了半天才发现,哎...
  睡觉去... 

修改时间:	2011年7月30日 上午 9点29分

  刚才在vdata类型的属性值分析中加入了类型检测代码,防止类型不同造成的异常;
  今天周六,一会儿收拾下去公司上网玩..
  现在完成了编译器的98%的工作(基本完备语法的98%),估计的值..感觉现在没有大的问题了;

  昨天想去公司上网,没开门.然后没意思去天坛玩,又到天安门和故宫玩.走得脚丫子疼.
  中午买了一份凉面,忽然想到一个好玩的事,就是把自己的编程语言加一个图形界面,直接
  把74595,ds1302和1602液晶屏等这些做成图形框,直接拖动,用连线代替端口配置,肯定很有意思..
  
修改时间:	2011年7月31日 上午 10点40分

  在vdata定义中把数据类型放在名称后,把地址区间放在地址类型后;

  现在是12点半,一会儿和同学去电子城帮他挑一个USB开发板学习.刚写了三个74595的级联测试程序,
  OK. 不是普通的级联,而是把下一个74595的三个输入端(CP,D,LOCK)连接到上一个74595的8个
  输出端的任意三根线上,这种级联方式. 编程应该很让人郁闷了~  
  但是仅仅20行代码就搞定了,用 "虚拟端口" 实现这个;

**********************************************
保存时间:	2011年8月1日 晚上 9点09分

修改时间:	2011年8月1日 1下午 1点10分

  把虚拟数据定义格式改了一下,把数据类型和地址类型放在一个赋值中: unit = ***; type = [*,*]bit;

修改时间:	2011年8月1日 下午 3点32分

  把 && ^^ || 的优先级分成3个,其他的没变;

**********************************************
保存时间:	2011年8月1日 ??点??分

修改时间:	2011年8月1日 晚上 10点07分

  把常量列表和变量列表合并到一起,不知道当初为什么把它们分开.. 初步测试通过;

修改时间:	2011年8月2日 上午 10点45分

  把常量定义改成和变量一样,去掉了const关键字,
  原来的格式:	const uint8 WIDTH = 200;
  现在的格式:	uint8 WIDTH	  = [u.const]500;

  把变量地址的设定改成类似形式,
  原来的格式:	uint8 P1	= @0x80;
  现在的格式:	uint8 P1	= [u.addr]0x80;

修改时间:	2011年8月2日 下午 2点22分

  初步增加了函数指针的一些支持,仅仅可以定义函数指针,而无法工作;发现编译器的类型系统应该重新设计,
  目前的有点乱,有些概念模棱两可..需要设计一种对称的类型系统,可以支持运算符重载(像C++那样的);

**********************************************
记录时间:	2011年8月7日 晚上 10点59分

  这几天一直在想关于指针和引用,以及规范的类型系统应该是什么样子...头疼.
  最终决定:去掉指针类型,像C#那样分为值类型和引用类型,通过一些辅助办法使引用类型实现指针的功能;

  昨天是七夕节, 牛郎和织女相会的日子,.. 哎呀@#%&$&^%$&*#$

**********************************************
记录时间:	2011年8月8日 晚上 9点04分

  今天终于把指针和引用的关系弄清楚了,有一个非常好的关系去描述指针和引用,就像C#中的装箱和拆箱
  一样...指针是值类型,引用是引用类型..
  下班后吃碗面条,下着大雨...然后去等公交,好容易上了车,结果开了一站就堵住了,没办法
  下车,自己走. 也没有伞,雨下得还大..失魂落魄的走了一个小时终于走到住的地方..

**********************************************
记录时间:	2011年8月11日 晚上 11:20

  今天把引用和值类型的关系弄清了,下一步是设计运算符的重载;

**********************************************
记录时间:	2011年8月19日 上午 11:54

  打算辞职,过两天回学校参加电子设计大赛,然后一心考研;明天周六去中发电子城买些电子元件准备比赛,
  再去王府井那的一个琴行看下电子琴和电钢琴,比较下音质看买哪种;



