初级执事
阅读权限 2
积分 1985
侠名
UID 43
主题
帖子
精华
好友
银子
金子
贡献
威望
推广
活跃
荣耀
注册时间 2017-11-7
最后登录 1970-1-1
在线时间 小时
个人主页
|
楼主 |
发表于 2018-11-9 16:45:03
|
显示全部楼层
本帖最后由 general_clarke 于 2018-11-10 12:11 编辑
为了将
var a:String = "HelloWorld";
trace(a);
转换成
string a = "HelloWorld";
System.Console.WriteLine(a);
首先要让程序能读懂这句的单词和语法。
将上述代码当作字符串
使用for循环逐个charAt(i),制定规则断句
所谓断句的规则,
从0位置开始,
在当前位置读入一个字符,如果是英文,那么向后一直读到下个英数之外字符之前位置,根据内容分类成关键字或标识符。
当前位置读入的如果是数字,向后读到下个非数字的字符之前位置,读取到的内容作为数字
当前位置读入的如果是其他符号,向后读到下个空白区域或者英数之前位置,读取到的内容作为符号。
一些特例,比如0x开头的数字,或者写作英数的符号(is as in)因为是特例所以特殊判断。
再如"*"有时表示乘法,有时表示类型。
因为实际上特例颇多,这个字符串解析步骤我做了不少天才完成
之后得到了下面的数组。
[["关键字", var], ["空白", " "], ["标识符", "a"], ["符号",":"], ["标识符", "String"], ["空白", " "], ["符号", "="], ["空白", " "], ["字符串", "\"HelloWorld\""], ["符号", ";"]]
这样得到了as3原文每个“单词”的类型数组。
用数组表示“单词”不利于扩展,
设每个不能形成AS3Value但是有意义的”单词”为AS3Atom,根据单词的类型做AS3Atom的不同派生类
例如上面提到的["标识符", "a"],表示成new AS3AtomSymbol("a");
整个var a:String = "HelloWorld";被转换为
[new AS3AtomKey("var"), new AS3Space(" "), new AS3AtomSymbol("a"), new AS3AtomOper(":"), new AS3AtomSymbol("String"), new AS3AtomSpace(" "), new AS3AtomOper("="), new AS3AtomSpace(" "), new AS3AtomString("\"HelloWorld\""), new AS3AtomOper(";")]
同理获得到trace(a);的每个“单词”类型数组
有了单词,那么接着考虑的是如何来表示语法。
|
|