天下网吧 >> 网吧方案 >> 网络方案 >> 正文

详解光纤技术与各类接入网络

按:这是以前遇到的一个微软技术面试题,当时觉得比较麻烦,要涉及到使用 树 tree 等数据结构,所以一直保留在脑海中。今天下午碰巧拿到了传说中的 Dragon Book,于是尝试自己动手写写看。

花了2个小时写的这个解释器还是比较简单的,仅仅能够做四则运算。现在还不支持括号,以及一元运算符,比如负号运算符。源代码可以在这里下载:http://files.cnblogs.com/yinyueyouge/Arithemic.7z

运行的主界面如下:

image

解释器也能够判断非法的输入:

image

现在这个解释器还非常原始。若是有 bug 发现,请提示出来,我会更正。:)

现在来解说下这个解释器的原理。

一、输入和输出

输入是一个用字符串表达的四则运算,比如 1 + 2 * 3 。目的是试图去理解这个字符串表达的运算指令,然后计算出结果 7。之所以是一个解释器 Interpreter,而不是一个编译器 Compiler,是因为程序是去理解指令并且执行指令,而不是把指令编译成机器代码来运行;后者是编译器的目标。

在解释的过程中,要能够分辨出不合法的指令:比如非法的字符 abc,非法的数字 2.3.1.4,非法的运算指令 2 * + 3,还有等等。

整个程序可以分为两个部分:

第一个部分,是截取输入字符串,然后返回单元指令。比如,对于指令 1 + 2 * 3 – 4 / 5,就需要被分解成如下所示的单元指令集:

image

第二个部分,是把单元指令集(上图橙色包含部分)组成一个树结构,称之为 Abstract Syntax Tree。按照将来需要解释的顺序,优先执行的指令会放在树的叶的位置,最后执行的指令会是树的根 Root。

image

在上图所示的 Abstract Syntax Tree 中,最先执行的指令是位于树上最深的子树,也就是 * ,然后是第二级的 + 和 / ,最后执行的位于根的指令 – 。

二、截取单元指令 (Tokenize)

因为程序比较简单,只有 2 种单元指令:NumToken 和 OpToken。

我定义了一个基本类,叫做 Token,然后 NumToken 和 OpToken 继承了该基本类。

Class Token:什么也没有,暂时是空壳子。

internal abstract class Token
{
}

Class NumToken: 表述一个数。

internal sealed class NumToken : Token
{
public double Value { get; }
}

Class OpToken: 表述一个运算符。

internal sealed class OpToken : Token
{
public Op Value { get; }
public Prioirty Prioirty { get; }
}
 

Op 和 Priority

[1] [2] [3] 下一页

本文来源:天下网吧 作者:网吧方案

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系Email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下