一个关于BOOST中SPIRIT的问题!

Lisk应用链 2010-08-30 10:05:44
符号说明:
{...} 表示一个定义
[...] 表示内容可有可无
..|.. 表示内容多选一
‘’ 表示单引号内的字符应原样出现在实际的定义中 字符<...> 表示一个变量


已知EBNF语法如下:

<合格条件>::={<条件逻辑><条件名称>‘:’<子条件>[,...n]}
<条件逻辑>::={[‘#’]‘&’|‘|’[‘+’][‘(’<课程组合格门数>[‘,’<课程组合格学分>]‘)’]}
<子条件>::={‘(’<合格条件>‘)’|<课程代码>}

转换成SPIRIT语法怎么写?求各位牛人帮忙!
...全文
95 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lisk应用链 2010-08-30
  • 打赏
  • 举报
回复
parsed failed
&:1,2,(|(2,5):(|:3,4,9)),(&2:5,6),7,8
^
请按任意键继续. . .

上面发帖的时候版面错位了..结果应该如上所示
Lisk应用链 2010-08-30
  • 打赏
  • 举报
回复
//主程序代码
int _tmain(int argc, _TCHAR* argv[])
{
//用于解析的字符串
rule<phrase_scanner_t> factor, term, exp;
//直接使用phoenix的lambda表达式作为Actor
factor = !ch_p('#')>>ch_p('&')|'|'>>!ch_p('+')>>!(ch_p('(')>>+digit_p>>!(ch_p(',')>>+digit_p)>>ch_p(')'));
term = (ch_p('(')>>exp>>ch_p(')'))|+digit_p;
exp = factor>>ch_p(':')>>term % ch_p(',');

const char *szNumberList = "&:1,2,(|(2,5):(|:3,4,9)),(&2:5,6),7,8";
//加入函数
parse_info<> r = parse( szNumberList, exp);
cout << "parsed " << (r.full?"successful":"failed") << endl;
cout << szNumberList << endl;
//使用parse_info::stop确定最后解析的位置便于查错
cout << string(r.stop - szNumberList, ' ') << '^' << endl;
system("pause");
return 0;

}
以下是命令行窗口显示的结果...
parsed failed
&:1,2,(|(2,5):(|:3,4,9)),(&2:5,6),7,8
^
请按任意键继续. . .
求指点..
Lisk应用链 2010-08-30
  • 打赏
  • 举报
回复
我会写一点 但是过滤的时候 总是过滤的不准....SPIRIT刚入门..说不定连入门都不算哈
Waiting4you 2010-08-30
  • 打赏
  • 举报
回复
另外,我有点好奇,你SPIRIT的规则都不会写,怎么用SPIRIT呢
Waiting4you 2010-08-30
  • 打赏
  • 举报
回复
哦,那把
子条件>>*( ',' >> 合格条件 );
改成
子条件>>*( ',' >> 子条件 );

Lisk应用链 2010-08-30
  • 打赏
  • 举报
回复
大哥[,...n]这个代表子条件多次重复,组成这样<子条件,子条件,.......>
Waiting4you 2010-08-30
  • 打赏
  • 举报
回复
这个EBNF貌似不是很严谨,[,...n]是何意?下面的代码假设它是多次重复。另外,条件逻辑的|运算的优先级是多少?

rule<phrase_scanner_t> 合格条件,条件逻辑,子条件
合格条件 = 条件逻辑>>条件逻辑>>':'>>子条件>>*( ',' >> 合格条件 );
条件逻辑 = (!ch_p('#') >> '&') | ('|' >> !ch_p('+')) >> !('(' >> 课程组合格门数 >> !(',' >> 课程组合格学分 ) >> ')');
子条件 = ('(' >> 合格条件 >> ')') | 课程代码;

没验证,基本是这个样子,你可以看一下这个文章:http://www.cppprog.com/2009/0121/55.html

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧