- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 boost:spirit 的新手,我猜这个问题对于高级用户来说是微不足道的。以下语法不符合我的预期:
#pragma once
#include <string>
#include <vector>
#define BOOST_SPIRIT_UNICODE
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/qi_alternative.hpp>
namespace overmath
{
using namespace std;
namespace qi = boost::spirit::qi;
using namespace boost::spirit::unicode;
struct identifier
{
wstring name;
};
struct function
{
identifier name;
};
struct program
{
vector<function> functions;
};
}
BOOST_FUSION_ADAPT_STRUCT(
overmath::identifier,
(std::wstring, name)
)
BOOST_FUSION_ADAPT_STRUCT(
overmath::function,
(overmath::identifier, name)
)
BOOST_FUSION_ADAPT_STRUCT(
overmath::program,
(std::vector<overmath::function>, functions)
)
namespace overmath
{
using namespace boost::spirit::unicode;
namespace qi = boost::spirit::qi;
using boost::spirit::lit;
template<typename Iterator> struct function_parser : qi::grammar<Iterator, program(), space_type>
{
function_parser() : function_parser::base_type(program)
{
identifier %=
qi::eps
>> +alnum;
function %=
lit("def ")
>> identifier
>> '('
>> ')'
>> lit(" enddef");
program %=
qi::eps
>> +function;
}
qi::rule<Iterator, identifier(), space_type> identifier;
qi::rule<Iterator, function(), space_type> function;
qi::rule<Iterator, program(), space_type> program;
};
template<typename Iterator> wstring parse(Iterator first, Iterator last)
{
using boost::spirit::qi::phrase_parse;
program f;
function_parser<Iterator> fp;
auto b = phrase_parse(first, last, fp, space, f);
if(b)
{
return wstring(L"OK");
}
return wstring(L"FAIL");
}
}
当我用字符串“def abc() enddef”测试它时,解析失败。我不知道为什么。我做错了什么?非常感谢。
最佳答案
你的 skipper 吃掉了空格,所以 "def "
和 "enddef"
永远不会匹配。
另见 Boost spirit skipper issues
#include <string>
#include <vector>
#define BOOST_SPIRIT_UNICODE
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/qi_alternative.hpp>
namespace overmath {
using namespace std;
namespace qi = boost::spirit::qi;
using namespace boost::spirit::unicode;
struct identifier { wstring name; } ;
struct function { identifier name; } ;
struct program { vector<function> functions; } ;
}
BOOST_FUSION_ADAPT_STRUCT(overmath::identifier, (std::wstring, name))
BOOST_FUSION_ADAPT_STRUCT(overmath::function, (overmath::identifier, name))
BOOST_FUSION_ADAPT_STRUCT(overmath::program, (std::vector<overmath::function>, functions))
namespace overmath {
using namespace boost::spirit::unicode;
namespace qi = boost::spirit::qi;
using boost::spirit::lit;
template <typename Iterator> struct function_parser : qi::grammar<Iterator, program(), space_type> {
function_parser() : function_parser::base_type(program) {
identifier = qi::eps >> +alnum;
function = "def" >> identifier >> '(' >> ')' >> "enddef";
program = qi::eps >> +function;
}
qi::rule<Iterator, identifier()> identifier;
qi::rule<Iterator, function(), space_type> function;
qi::rule<Iterator, program(), space_type> program;
};
template <typename Iterator> wstring parse(Iterator first, Iterator last) {
using boost::spirit::qi::phrase_parse;
program f;
function_parser<Iterator> fp;
auto b = phrase_parse(first, last, fp, space, f);
if (b) {
return wstring(L"OK");
}
return wstring(L"FAIL");
}
}
int main() {
std::wstring const s = L"def abc() enddef";
std::wcout << overmath::parse(s.begin(), s.end());
}
关于c++ - 语法意外失败 boost::spirit 语法定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34123164/
在此处回答的另一个问题中,我发现了以下 JavaScript代码: function _dom_trackActiveElement(evt) { if (evt && evt.target)
if (A == 0) OR (B == 0) 怎么说? 最佳答案 只是为了讽刺: if (A === 0 || B === 0) 关于语法,我们在Stack Overflow上找到一个类似的问题:
var ret = [] ,xresult = document.evaluate(exp, rootEl, null, X
我一直在寻找一些类似于下例的 JavaScript。有人可以解释一下吗,因为我以前从未见过这样编写的 JavaScript。 “SomethingHere”和冒号代表什么?我习惯于看到函数 myFun
这是我的程序: delimiter // drop procedure if exists migContactToActor; create procedure migContactToActor(
我遇到了一个问题。我一直在使用 gcc 编译/汇编我的 C 代码一段时间,并且习惯了阅读 Intel 汇编语法。我在生成程序集文件时使用了 -masm=intel 标志。 但是最近因为公司迁移,拿到了
自上而下和自下而上语法有什么区别?举个例子就太好了。 最佳答案 首先,语法本身不是自上而下或自下而上的,解析器是(尽管有些语法可以被其中一个解析,但不能被另一个解析)。 从实践的角度来看,主要区别在于
我知道这是草率的代码,但它是: display dialog ("Start Screensaver. Please type: matrix, coffee, waffles, star, wate
这个问题已经有答案了: Giving name to a loop (6 个回答) 已关闭 8 年前。 我见过这个字符在 C# 中使用,就像 Java 中的扩展一样,但最近我在代码中发现了这个 loo
我正在尝试编写一个函数来检查字符串是否为回文,但我认为在使用字符串指针时存在一些错误。这段代码有什么问题? #include #include #define MAX 1000 int IsPalin
所以在this question我询问了一些 Javascript 是如何被压缩的。问题已得到解答,但以下片段让我非常困惑,以至于我不得不问另一个问题。在这里: for (Y = 0; $ = 'zx
假设我有一个接受这些参数的函数。 int create(Ptr * p,void * (*insert)(void *, void *)) { //return something later } 结
这个问题已经有答案了: Bitwise '&' operator (6 个回答) 已关闭 5 年前。 我在代码中找到了这个,但我从未遇到过像 & 这样的事情,仅 && if ((code & 1) =
我在处理继承类及其中的构造函数和方法的语法时遇到了问题。 我想实现一个类日期和一个子类 date_ISO,它们将按特定顺序设置给定的日、月、年,并通过一种方法将其写入字符串。我觉得我的基类日期工作正常
我正在尝试通过存储过程填充表,如下所示: SET @resultsCount = (SELECT COUNT(*) FROM tableA); SET @i = 0; WHILE @i THEN
谁能解释一下下面代码中的“<<”? mysql test<
刚刚开始学习 MySQL,这是一个菜鸟问题,也是我在 StackOverflow 上的第一个问题。 假设我有 12 个订单状态,我想从其中的 5 个中选择总计。我会使用: SELECT SUM(tot
我的编程背景是在学校学过一点Java。由于某些原因,JavaScript 语法往往让我感到困惑。下面的 JavaScript 代码是一种我不知道如何构成的语法模式: foo.ready = funct
我正在阅读 javascript 源代码,并且我以前没有编写过 javascript。我对它的一些语法感到困惑。 $(function () { window.onload=function
我什至不知道如何命名我想要的东西。那么让我举个例子来解释一下。 虽然火狐使用textContent,但其他浏览器支持innerText属性。顺便说一句,如果我使用了错误的术语,请纠正我。无论如何,到目
我是一名优秀的程序员,十分优秀!