金慶的專欄
C++博客
::
首頁
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
::
423 隨筆 :: 0 文章 :: 454 評(píng)論 :: 0 Trackbacks
公告
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(12)
給我留言
查看公開留言
查看私人留言
隨筆分類
(502)
1. C/C++(166)
(rss)
2. 網(wǎng)游開發(fā)(108)
(rss)
3. Golang(20)
(rss)
4. Linux/Unix(30)
(rss)
5. 軟工與管理(44)
(rss)
6. Python(23)
(rss)
7. Erlang(18)
(rss)
8. Rust(16)
(rss)
9. 其它(77)
(rss)
隨筆檔案
(423)
2023年1月 (1)
2022年11月 (1)
2022年10月 (2)
2022年9月 (1)
2022年4月 (6)
2022年1月 (2)
2021年12月 (4)
2021年11月 (6)
2021年10月 (2)
2021年9月 (2)
2021年8月 (7)
2021年7月 (2)
2021年5月 (2)
2021年3月 (1)
2021年2月 (2)
2021年1月 (1)
2020年12月 (1)
2020年10月 (1)
2020年9月 (5)
2020年8月 (1)
2020年7月 (1)
2020年6月 (1)
2020年4月 (2)
2020年3月 (3)
2020年2月 (3)
2020年1月 (1)
2019年12月 (1)
2019年9月 (2)
2019年4月 (2)
2019年1月 (1)
2018年12月 (1)
2018年11月 (3)
2018年10月 (1)
2018年9月 (3)
2018年8月 (3)
2018年7月 (2)
2018年6月 (4)
2018年5月 (4)
2018年4月 (4)
2018年3月 (1)
2018年1月 (2)
2017年12月 (2)
2017年11月 (3)
2017年10月 (3)
2017年8月 (7)
2017年7月 (1)
2017年6月 (1)
2017年5月 (3)
2017年4月 (3)
2017年3月 (3)
2017年2月 (2)
2017年1月 (2)
2016年12月 (5)
2016年11月 (2)
2016年10月 (2)
2016年9月 (1)
2016年8月 (6)
2016年7月 (3)
2016年6月 (2)
2016年5月 (4)
2016年4月 (2)
2016年3月 (2)
2016年1月 (3)
2015年12月 (2)
2015年11月 (2)
2015年10月 (1)
2015年8月 (2)
2015年7月 (1)
2015年6月 (1)
2015年5月 (4)
2015年4月 (3)
2015年3月 (4)
2015年2月 (5)
2015年1月 (4)
2014年12月 (3)
2014年11月 (3)
2014年10月 (2)
2014年9月 (3)
2014年8月 (1)
2014年4月 (4)
2014年3月 (1)
2014年2月 (4)
2014年1月 (5)
2013年12月 (5)
2013年11月 (5)
2013年9月 (2)
2013年8月 (2)
2013年7月 (2)
2013年6月 (2)
2013年5月 (1)
2013年1月 (2)
2012年12月 (1)
2012年11月 (1)
2012年9月 (1)
2012年8月 (3)
2012年7月 (2)
2012年6月 (1)
2012年4月 (3)
2012年3月 (2)
2012年2月 (3)
2012年1月 (2)
2011年11月 (2)
2011年10月 (3)
2011年9月 (2)
2011年8月 (2)
2011年7月 (3)
2011年6月 (2)
2011年5月 (3)
2011年1月 (2)
2010年12月 (1)
2010年11月 (2)
2010年10月 (2)
2010年9月 (3)
2010年8月 (2)
2010年7月 (3)
2010年6月 (1)
2010年5月 (3)
2010年4月 (3)
2010年3月 (5)
2010年2月 (4)
2010年1月 (4)
2009年12月 (2)
2009年11月 (3)
2009年10月 (4)
2009年9月 (3)
2009年8月 (2)
2009年7月 (4)
2009年6月 (1)
2009年5月 (3)
2009年4月 (4)
2009年3月 (2)
2009年2月 (5)
2009年1月 (1)
2008年12月 (7)
2008年11月 (4)
2008年10月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (3)
2008年6月 (4)
2008年5月 (6)
2008年4月 (7)
2008年3月 (6)
2008年1月 (5)
2007年12月 (7)
2007年11月 (4)
2007年10月 (5)
2007年9月 (6)
2007年8月 (8)
2007年7月 (5)
相冊(cè)
公告照片
搜索
積分與排名
積分 - 656585
排名 - 25
最新評(píng)論
1.?re: boost::asio::spawn 將一統(tǒng)C++網(wǎng)絡(luò)庫
asio 成為C++首選網(wǎng)絡(luò)庫
--linda
2.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--金慶
3.?re: mingw編譯OrzNet
能發(fā)送一個(gè)mingw編譯好的OrzNet庫給我嗎? liuweiqcxy@163.com
謝謝!
--劉威
4.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--bigbad
5.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--bigbad
閱讀排行榜
1.?"multiple definition of" 錯(cuò)誤(11032)
2.?SVN中邪惡的replace(10955)
3.?VS2005編譯libevent(10413)
4.?混音算法的學(xué)習(xí)與研究(10203)
5.?C調(diào)用lua腳本的效率測(cè)試(9007)
評(píng)論排行榜
1.?VC6正在被拋棄(35)
2.?VS2005編譯libevent(21)
3.?"multiple definition of" 錯(cuò)誤(18)
4.?C++引用優(yōu)于指針(17)
5.?ACE與ASIO之間關(guān)于Socket編程的比較(16)
用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
用boost::spirit實(shí)現(xiàn)一個(gè)表達(dá)式求值看上去比較簡(jiǎn)單。我這個(gè)還有點(diǎn)問題,有空格時(shí)會(huì)解析失敗,請(qǐng)大家看看是什么原因?
123*34+2323/324
parsing succeeded
result = 4189
2 + 3
parsing failed
#include <iostream>
#include <stack>
#include <functional>
#include <boost/function.hpp>
// #define BOOST_SPIRIT_DEBUG
#include <boost/spirit.hpp>
using namespace std;
stack<int> evaluationStack;
struct Push
{
void operator()(int d) const
{
evaluationStack.push(d);
}
};
void doOp(boost::function<int(int, int)> op)
{
int rhs = evaluationStack.top();
evaluationStack.pop();
int lhs = evaluationStack.top();
evaluationStack.pop();
int result = op(lhs, rhs);
evaluationStack.push(result);
}
void add2(char const*, char const*) { doOp(std::plus<int>()); }
void sub2(char const*, char const*) { doOp(std::minus<int>()); }
void mul2(char const*, char const*) { doOp(std::multiplies<int>()); }
void div2(char const*, char const*) { doOp(std::divides<int>()); }
int main()
{
using namespace boost::spirit;
/*
group ::= '(' expression ')'
factor ::= integer | group
term ::= factor (('*' factor) | ('/' factor))*
expression ::= term (('+' term) | ('-' term))*
Spirit:
group = '(' >> expression >> ')';
factor = integer | group;
term = factor >> *(('*' >> factor) | ('/' >> factor));
expression = term >> *(('+' >> term) | ('-' >> term));
*/
rule<> group, factor, term, expression;
group = '(' >> expression >> ')';
factor = int_p[Push()] | group;
term = factor
>> *( ('*' >> factor) [&mul2]
| ('/' >> factor) [&div2] )
;
expression = term
>> *( ('+' >> term) [&add2]
| ('-' >> term) [&sub2] )
;
string s;
while (getline(cin, s))
{
if (parse(s.c_str(), expression, space_p).full)
{
cout << "parsing succeeded\n";
cout << "result = " << evaluationStack.top();
evaluationStack.pop();
}
else
{
cout << "parsing failed";
}
cout << endl;
}
}
posted on 2009-03-27 16:24
金慶
閱讀(2451)
評(píng)論(9)
編輯
收藏
引用
所屬分類:
1. C/C++
評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
2009-03-27 17:55
空明流轉(zhuǎn)
你開Debug模式看看呢。
回復(fù)
更多評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
2009-03-27 17:59
空明流轉(zhuǎn)
parse(s.c_str(), expression, *space_p)
expression = XXXXX >> eol_p
回復(fù)
更多評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
2009-04-03 11:32
金慶
@空明流轉(zhuǎn)
試了下,還是不對(duì)。
space_p前面加個(gè)*是什么意思?
expression以eol_p結(jié)尾肯定是不對(duì)的,因?yàn)間roup定義為(exp).
打開上面的DEBUG宏也沒什么幫助。
回復(fù)
更多評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
2009-04-03 12:34
空明流轉(zhuǎn)
回頭我?guī)湍憧纯础?nbsp;
回復(fù)
更多評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值[未登錄]
2009-04-03 21:19
可冰
將語法作以下修改就好了。
rule<> group, factor, term, expression, integer;
group = * space_p >> '(' >> expression >> * space_p >> ')' >> * space_p;
integer = * space_p >> int_p[Push()] >> * space_p;
factor = integer | group;
term = factor
>> *( (* space_p >> '*' >> factor) [&mul2]
| (* space_p >> '/' >> factor) [&div2] )
;
expression = term
>> *( (* space_p >> '+' >> term) [&add2]
| (* space_p >> '-' >> term) [&sub2] )
;
回復(fù)
更多評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
2009-04-04 12:18
空明流轉(zhuǎn)
@金慶
我看了下,你的rule的Paser類型應(yīng)該是不對(duì)的。rule<>是默認(rèn)的lexeme類型,而實(shí)際上,語法規(guī)則的應(yīng)該是Phrase Parser。
如果你不明確你要的parser類型,應(yīng)該用Grammar,讓編譯器自動(dòng)推導(dǎo)。
回復(fù)
更多評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
2009-04-05 14:57
金慶
@空明流轉(zhuǎn)
謝謝。
根據(jù)你的提示,我再深入看了看spirit的幫助,其中例子calc_plain.cpp用的就是grammar. 只要把這個(gè)例子中的加減乘除及壓棧動(dòng)作實(shí)現(xiàn)就是一個(gè)表達(dá)式求值。
回復(fù)
更多評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
2010-01-14 12:40
王漢平
求教:你好,用DEVCPP 編譯你上面的例子,總提示In file included from jsq.cpp:7:
D:/Dev/Dev-Cpp/include/boost/spirit.hpp:18:4: warning: #warning "This header is deprecated. Please use: boost/spirit/include/classic.hpp"
不知道什么原因?
回復(fù)
更多評(píng)論
#
re: 用boost::spirit實(shí)現(xiàn)的表達(dá)式求值
2010-01-14 13:18
金慶
@王漢平
我查了一下,是spirit有新舊版本區(qū)別。以上代碼是舊的使用方法(classic).
可以忽略該警告。
也可以如下更改:
-#include <boost/spirit.hpp>
+#include <boost/spirit/include/classic.hpp>
- using namespace boost::spirit;
+ using namespace boost::spirit::classic;
回復(fù)
更多評(píng)論
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
How are dtLinks created in NavMesh
C++ parameter passing rules
Naming Conventions for Accessors
Visual Studio 2019 Compiler Hangs
Fbx File Format Identifier
查找內(nèi)存錯(cuò)誤
std::thread 中的異常會(huì)丟失調(diào)用棧
用賦值代替 protobuf CopyFrom()
vs2017 linux 編譯輸出改成 vs 格式
為 LiteIDE 添加選中標(biāo)記
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © 金慶
丁香五月网久久综合
|
精品久久久中文字幕人妻
|
国产美女亚洲精品久久久综合
|
国产精品久久婷婷六月丁香
|
欧美噜噜久久久XXX
|
欧美久久综合性欧美
|
伊人久久大香线蕉综合热线
|
国产精品一区二区久久不卡
|
久久久久女教师免费一区
|
综合久久精品色
|
久久精品国产WWW456C0M
|
国产成人久久精品一区二区三区
|
精品免费tv久久久久久久
|
久久久久亚洲AV无码永不
|
亚洲精品午夜国产va久久
|
国产情侣久久久久aⅴ免费
|
伊人情人综合成人久久网小说
|
91亚洲国产成人久久精品网址
|
亚洲国产精品无码久久
|
久久亚洲精品成人无码网站
|
久久亚洲综合色一区二区三区
|
精品多毛少妇人妻AV免费久久
|
久久免费国产精品
|
国产精品美女久久久久av爽
|
精品久久久久中文字幕日本
|
国产精品久久久久免费a∨
|
国产亚洲色婷婷久久99精品91
|
精品亚洲综合久久中文字幕
|
7777久久久国产精品消防器材
|
免费一级欧美大片久久网
|
久久久91人妻无码精品蜜桃HD
|
国产美女亚洲精品久久久综合
|
色狠狠久久综合网
|
中文字幕无码久久精品青草
|
久久久久国产日韩精品网站
|
九九久久精品无码专区
|
超级碰久久免费公开视频
|
国产精品免费久久久久电影网
|
国产AⅤ精品一区二区三区久久
|
9999国产精品欧美久久久久久
|
亚洲精品高清久久
|