C++ 提神器及相关部件

C++ 提神器及相关部件,c++,boost,boost-spirit,boost-spirit-qi,C++,Boost,Boost Spirit,Boost Spirit Qi,我需要通过激励精神创建一个规则,该规则应与以下情况相匹配: return foo; return (foo; 及 我试过这样的smth: start %= "return" >> -boost::spirit::qi::char_('(') >> identifier >> -boost::spirit::qi::char_(')') >> ';'; 但即使在这样的情况下,这也会成功 及 我该怎么解决呢?你的例子看起来只是病态的,因为你使用的

我需要通过激励精神创建一个规则,该规则应与以下情况相匹配:

return foo;
return (foo;

我试过这样的smth:

start %= "return" >> -boost::spirit::qi::char_('(') >> identifier >> -boost::spirit::qi::char_(')') >> ';';
但即使在这样的情况下,这也会成功


我该怎么解决呢?

你的例子看起来只是病态的,因为你使用的是一个过于具体的例子

实际上,您不需要
“return”>>标识符。通常,返回的东西只是一个表达式。那么,你会说

expr = literal | variable | function_call;
现在,在《俯冲》中,迎合括号内表达的一般方法很简单:

expr = literal | variable | function_call
     | ('(' >> expr >> ')')
     ;
砰。完成。它处理平衡问题。它处理嵌套的括号。它处理
(((foo)))
偶数。那天一个哨子也没有


我认为根本没有什么不对。我已经在这个网站上的答案中发布了20多个不同的递归表达式语法。它们应该提供激励性的示例(显示运算符优先级并用括号推翻它们)。

您的示例看起来只是病态的,因为您使用的示例过于具体

实际上,您不需要
“return”>>标识符。通常,返回的东西只是一个表达式。那么,你会说

expr = literal | variable | function_call;
现在,在《俯冲》中,迎合括号内表达的一般方法很简单:

expr = literal | variable | function_call
     | ('(' >> expr >> ')')
     ;
砰。完成。它处理平衡问题。它处理嵌套的括号。它处理
(((foo)))
偶数。那天一个哨子也没有



我认为根本没有什么不对。我已经在这个网站上的答案中发布了20多个不同的递归表达式语法。它们应该提供激励性的示例(显示运算符优先级并用括号推翻它们)。

关于
语句=(“返回”>>标识符>>';'))|((“返回”>>(“>>标识符>>”)“>>”)
?@faranwath是的,我已经考虑过了,但看起来很可怕,特别是当我有很多类似结构的规则时,可怕吗?我想我们在使产生式规则看起来漂亮的方面有所不同,但这是你的工作,这很公平。因为你似乎有很多这样的规则,你可以使用相关的解析器(这里是标识符)作为处理括号的解析器的参数。但是,作为解析器参数的解析器有一些问题,sehe在这里发表了一篇很好的文章,但是我现在找不到它。而且我需要有相同数量的开括号和闭括号,我甚至可以在一个表达式中有两个或多个括号对。
语句=(“return”>>标识符>>;”)|(“return”>>”(“>>标识符>>”)“>>”;”)
?@faranwath Yep,我已经考虑过了,但它看起来很可怕,特别是当我有很多类似结构的规则时更是如此可怕?我想我们在使生成规则看起来漂亮的原因上有所不同,但这是你的工作,这很公平。既然你似乎有很多规则,你可以使用相关的解析器(这里是标识符)作为处理括号的解析器的参数。但是,作为解析器参数的解析器有一些问题,sehe在这里发表了一篇很好的帖子,但是我现在找不到。另外,我需要有相同数量的开括号和闭括号,我甚至可以在一个表达式中有两个或更多的括号对。你能告诉我为什么吗以下代码是否因“堆栈溢出”错误而崩溃?输入数据-我猜这是在我的规则中添加递归的结果。我对吗?我如何修复它?左侧递归和PEG语法:)它们不混合。请重新措辞好吗?如果使用boost spirit,我应该怎么做?这只是为了解决编译问题(规则隐藏类型名称):好的,谢谢。我使用的是MSVC-11.0和boost 1.54,它根本不会给我任何错误。你能回答我关于规则中的递归和堆栈溢出的问题吗?你能告诉我为什么下面的代码会因为“堆栈溢出”错误而崩溃吗?输入数据-我猜这是在我的规则中添加递归的结果。我说得对吗?我怎样才能修复它?左递归和PEG语法:)它们不混合。请你重新措辞好吗?如果使用boost spirit,我应该怎么做?这只是为了解决编译问题(规则隐藏类型名称):好的,谢谢。我使用的是MSVC-11.0和boost 1.54,它根本不会给我任何错误。你能回答我关于规则中的递归和堆栈溢出的问题吗?