您的位置:首页 > 其它

转:谈谈编译原理和其在WEB开发中的应用2

2009-10-19 16:30 323 查看
上一篇谈到了词法分析,并且给了一小段词法分析上的代码。如果大家对着代码看,可能就会发现我构造了一个对象来对字符串进行读取。
具体代码是:CharReader src = new CharReader(chars);

这样子写是为了减少在后面的while语句对字符串数组末尾的判断,起到简化代码的作用;这样的小技巧在写一些比较复杂的算法的时候特别的重要。

实现完词法分析之后我们就要进行到下一步的语法分析了。教科书的的语法分析一般都是教我们怎么去实现一个抽象语法树,而我个人比较喜欢用所谓的面向对象的方式去实现它,这样子的实现方式代码看起来比较直观,而且扩展也相对容易一些。

  语法分析的前提是我们首先要构建出对应的对象结构。

ParseObject
private ObjectExpression ParseObject(TokenReader src)
{
src.AssertAndAdvance(TokenId.LCurly);
ObjectExpression o = new ObjectExpression(src.CurTok);

string name = string.Empty;

while (src.CurTok.TokenId != TokenId.RCurly && !src.Eof)
{
switch (src.CurTok.TokenId)
{
case TokenId.Ident:
case TokenId.String:
{
name = src.CurTok.Data;
src.Advance();
break;
}
case TokenId.Colon:
{
src.Advance();
o.Add(name, ParseValue(src));

if (src.CurTok.TokenId == TokenId.Comma)
src.Advance();

break;
}
default:
{
throw new JSONException("Illegal JSON object.");
}
}
}

return o;
}

  这样子整个语法分析的过程就已经完成,大家可能认为是因为json比较简单才可以用这样的方式来实现,其实不是,目前比较流行的编译器我们也可以用这样的方式来实现了,只是其结构会相对来说比较复杂一些而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: