boost::spirit::qi permutation parser and synthesized attributes(boost::spirit::qi 置换解析器和合成属性)
问题描述
我正在尝试将一个简单的命令行解析器与 SPIRIT 放在一起,而没有语义操作.我正在使用 BOOST 1.52,但我想避免使用 C++11 功能.语法具有以下语法:
I'm trying to put together a simple command line parser with SPIRIT without semantic actions. I'm using BOOST 1.52 but I would like to avoid using C++11 features. The grammar has the following syntax:
可选参数可以是任意顺序.我只成功解析了可选参数.一旦我添加了额外的强制性两个字符串解析器,它就会中断.即使我尝试明确写下rstart"属性并避免使用auto"进行类型推导,它也会中断.非常感谢任何帮助或建议!
Optional parameters can be in any order. I successfully parsed only optional parameters. Once I add the additional mandatory two string parsers it breaks. It breaks even when I try to write down the "rstart" attributes explicitly and avoid type deduction using "auto". Any help or suggestion is very appreciated!
推荐答案
你面临的问题是你的组合规则的属性基本上是:
The problem you are facing is that the attribute of your combined rule is basically:
并通过将您的变量一个一个地放在对短语解析的调用上,您基本上:
and by putting your variables one by one on the call to phrase_parse you have basically:
由于属性传播的工作方式,这就是正在发生的事情:
Because of the way attribute propagation works in spirit this is what is happening:
整个 tuple
被分配给你的 num1(忽略 bool 和第二个 size_t),在该精神尝试将第一个字符串分配给你的 bool 之后,导致你有错误.
the whole tuple<size_t,bool,size_t>
is assigned to your num1 (ignoring the bool and second size_t), after that spirit tries to assign the first string to your bool, resulting in the error you have.
我相信解决这个问题的最简洁的方法是创建一个自定义结构来保存反映规则结构的结果.
I believe the cleanest way to solve this is creating a custom struct to hold your result that reflects the structure of your rules.
在 LWS 上运行.
PS:如果不使用 boost::proto::deep_copy,您不能直接分配给使用 auto
声明的规则,这些规则中嵌入了文字(例如字符串或数字);
PS: You can't assign directly to rules declared with auto
that have literals embedded in them (strings or numbers for example) without using boost::proto::deep_copy;
有一个叫做 BOOST_SPIRIT_AUTO 的宏可以让它更容易使用:
There is a macro called BOOST_SPIRIT_AUTO that makes it easier to use:
这篇关于boost::spirit::qi 置换解析器和合成属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!