因为编译原理这本书实在太厚,不想花太多时间系统的学习这部分,但是我也有自己的想法,所以后面的工作是按照自己的想法来做的,我想着也是一种比较直接的做法。
上一篇写了类的结构分析,接下来进行的是语句的分析。
例如下面这样一段as3代码如何转换为js代码
var list = [1,2,3];
var sun:int = 0;
for(var i:int = 0; i < list.length; i++)
{
sun += list[i];
}
抛开类的结构剩下的就是具体的语句分析了,类有成员变量和成员函数,函数的类容有各种各样的语句构成。所以我分析一个类大概是这样的:
类
{
成员变量1;
成员变量2;
...
成员函数1;
成员函数2;
...
}
分析成员函数的内容就是这个部分的重点,语句分析,
我归纳语句为以下几种
package datas.sentenceStruct
{
/**
*语句类型
*
*/
public class SentenceType
{
/**
*表达式
*/
public static const EXPRESS:String = "=";
/**
*定义语句,一般指定义变量
*/
public static const DEFINE:String = "var";
/**
*if语句
*/
public static const IF:String = "if";
/**
*for语句
*/
public static const FOR:String = "for";
/**
*while语句
*/
public static const WHILE:String = "while";
/**
*switch语句
*/
public static const SWITCH:String = "switch";
/**
*break语句
*/
public static const BREAK:String = "break";
/**
*return语句
*/
public static const RETURN_TYPE:String = "return";
/**
*语句块
*/
public static const BLOCK:String = "{}";
/**
*空语句
*/
public static const EMPTY:String = ";";
/**
*require语句 ,js中有效
*/
public static const REQUIRE:String = "require()";
/**
*throw语句
*/
public static const THROW_TYPE:String = "throw";
}
}
语句的分析流程可以这样概括
function getSentence(file):SentenceBase
{
if(是for循环) return new ForSentence(file);
...
return 表达式语句(file);
}
例如for语句的结构如下
for(语句1;表达式1;表达式2) 内容语句
分析出关键字和分割符,具体的语句分析还是走上面的流程。
语句中除了表达式分析比较复杂,别的其实都很简单,没什么花哨的东西。