用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
DanceFire的公告
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script> <script type="text/javascript"> _uacct = "UA-3066512-3"; urchinTracker(); </script> <script type="text/javascript" src="http://www.google.com/reader/ui/publisher-zh_CN.js"></script> <script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/04848773461806185723/state/com.google/broadcast?n=5&callback=GRC_p(%7Bc%3A%22khaki%22%2Ct%3A%22Dancefire%20%5Cu7684%5Cu5171%5Cu4EAB%5Cu9879%5Cu76EE%22%2Cs%3A%22false%22%2Cb%3A%22false%22%7D)%3Bnew%20GRC"></script>
文章分类
L4 微内核实现
Fiasco - DROPS的底层微内核 (TU Dresden)
L4Ka::Pistachio (UKa, UNSW)
seL4 - Secure Embedded L4 (UNSW)
L4 微内核研究组
L4 总部
UKa的L4研究组
UNSW/NICTA的L4研究组
L4 文档
L4 X.2 API的用户手册(UNSW)
L4-embedded 参考手册 N1 (UNSW)
基于 L4 的操作系统
Darwin在L4上的移植 - Darbat (UNSW)
DROPS - 基于L4的嵌入式实时操作系统 (TU Dresden)
GNU Hurd在L4上的移植
Linux在L4上的移植 - L4Linux (TU Dresden)
Linux在L4上的移植 - Wombat (UNSW)
Mungi - Single Address Space OS based on L4 (UNSW)
朋友
Dancefire's website
ralph623的专栏(RSS)
sinboy的菜地(RSS)
Sunwear(RSS)
Xinsoft :应用之美,在于药到病除(RSS)
吕震宇(RSS)
强强专栏(RSS)
旁观生活的BT(RSS)
潇寒的Blog(RSS)
龙真先生(RSS)
存档

原创  也谈表达式分析和计算 收藏

昨天看到 王博炜 Blog中《五进制》这 篇文章。其中关于5进制到10进制的转换自然没有什么意思,这篇文章给的代码主要是讨论如何进行表达式分析和计算的。作者自制了一个Stack,并且用其 形成了两个堆栈分别用于存储数值和运算符。比较典型的表达式处理的方法。从实现上看,代码有些臃肿,而且必要的优化很少,另外就是没有充分利用标准提供的 便利。比如那个Stack完全没有必要自制,STL提供的std::stack<T>可以很好的完成任务。

而今天我要做的 是,使用boost::spirit来实现同样的表达式分析和计算。众所周知,boost是C++中质量很高的库,被称为准标准库,因为其存在的一个很重 要的目的就是为下一代C++库提供预案。目前已经有大量的boost库成为了C++标准库的一部分。我现在要用的是Boost的Spirit库。这个库可以直接在C++代码中撰写EBNF。学过编译原理的朋友应该对此都很熟悉,这是一种比堆栈更灵活的解析表达式甚至程序的方式。

如果我们要处理四则运算的表达式,那么我们只需要在C++中写入下列EBNF的定义:

我们就构成了这个表达式的格式定义,它可以很轻松的处理下列表达式的运算:

很简单吧?

使用过yacc或者*lex的朋友对这类定义肯定很熟悉。但是所不同的是,他们都是让用户写一个模板,然后用yacc或者*lex处理模板生成相应语言的程序。程序臃肿且很难阅读。而且由于不是自己写的程序,调整起来总要经过一步手续,比较繁琐。

而 使用C++的朋友则不用有这种烦恼,Boost的Spirit充分利用了C++强大的语法功能。我们可以直接在程序中写入上述的表达式定义,然后我们的程 序就支持这些表达式的处理了。不需要任何额外的程序处理。所需要的仅仅是include一些头文件而已。是的,仅仅是include一些头文件。不要担心 需要安装什么额外的东西,或者需要链接什么库,因为Spirit的实现完全是头文件组成的,我们不需要链接任何库。把boost的头文件路径放到编译期 中,直接编译就ok了。很轻巧。

下面就是我用Boost Spirit实现的四则运算表达式的代码,由于我的重点是表达式的解析和计算,因此我没有特别处理五进制到十进制的转换问题。但是添加起来显然不麻烦。我 只给出了一个五进制整数部分的输出。如果表达式出错,可以直接用箭头指出哪里有错。很方便调试:) 而且代码量是原文章的五分之一。编译后也仅仅是35KB,也不是很臃肿的。

大家多了解标准库,多了解Boost,C++的编码也是很有趣味的。

运行结果如下:

发表于 @ 2009年02月04日 12:24:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:让VS 2008支持Subversion

  • 发表评论
  • 评论内容:
  •  
Copyright © DanceFire
Powered by CSDN Blog