草庐IT

xml - 使用 XML 的 EBNF 实现 XML 转换器

我正在考虑使用基于W3C的XML1.1的编译器生成器实现XML转换器的想法。spec,其中包括完整的EBNF语法。更准确地说,我打算使用Qi-YACC因为我想学习这个工具。这将是我第一次尝试使用任何编译器。我计划实现的第一种翻译非常简单:XML到S-EXPRs.之后,我打算概括我的翻译,但这不是我的问题的重点。您预计此类项目会遇到什么重大陷阱吗?我读到使用其EBNF翻译XML是abadidea.我想知道为什么。而且Qi语言还没有XML解析器,所以我绝对不想在这里重新发明轮子。 最佳答案 我现在不知道解析XML需要上下文的原因。但是Q

c++ - 简单的 C 风格结构化输入的 Spirit Qi 解析问题

我正在尝试为一些使用熟悉且非常简单的“C风格”格式的游戏数据设置基本解析器。基本上,命名支撑的“结构”,然后将参数和嵌套的“结构”放入其中。它会解析这样的东西:Name0{Name1{Param0*=2Param2="lol"}Param0=1Param1="test"Name2{}}Name3{Param0="test"}但是,即使是简单的“Test{}”输入测试,它也失败了,更不用说像我上面的例子那样高级了。这些结构设置为使用fusion,这看起来很简单,我怀疑这是问题所在。我目前没有使用一些规则,而且我的大部分规则都未经测试,因为它在root中尝试第一个category规则时失败

c++ - 使用 boost spirit qi 解析器迭代填充 BGL 图

此问题是"Iterativeupdateofabstractsyntaxtreewithboostspirit"的后续问题.已知:解析器语法允许递归要求是:解析器的AST必须是BGL图。每个解析器步骤的输入可以是一对多的符号想法:此处显示了有关将spirit解析为BGL图的一些基本想法Usingboostgraphlibrary:howtocreateagraph...,但不完全满足要求,因为我希望能够迭代地解析一对多符号。猜测BGL图和spirit解析器必须相互了解一些信息才能在正确的位置填充数据。首先想到的是解析器必须能够处理图的顶点。解决方案,例如Usingsemanticact

c++ - 振奋 spirit : how to match any lexer token in qi?

我想将C++函数声明与默认参数值匹配,但忽略这些值。例如:intmyFunction(inta,intb=5+4);这是词法分析器的(一部分):structLexer:boost::spirit::lex::lexer{Lexer(){identifier="[A-Za-z_][A-Za-z0-9_]*";numLiteral="([0-9]+)|(0x[0-9a-fA-F]+)";this->self.add("int")('+')('=')('(')(')')(';')(',')(identifier)(numLiteral);}};我想编写一些解析器规则,例如:function=

c++ - 如何使用 Boost.Spirit.Qi 增量解析(并作用于)大文件?

我为自定义文本文件格式创建了一个Qi解析器。有数以万计的条目要处理,每个条目通常有1-10个子条目。我放了一个精简的解析器工作示例here.#include#include#include#include#include#include#include#include#include#include#include#include#includeusingstd::string;usingstd::vector;usingstd::cout;usingstd::endl;namespacemodel{namespaceqi=boost::spirit::qi;structspectru

c++ - 仅在 Boost.Spirit.Qi 语法初始化的优化构建中出现段错误

我在使用SpiritQi编写解析器时遇到了一个奇怪的问题:我在某个地方有一个错误导致-O优化崩溃,但并非没有优化。它在语法的构造函数中崩溃:templatestructmath_expression_grammar:qi::grammar{qi::ruleexpression,term,factorial,factor,pexpression,pfactor,nfactor,number;math_expression_grammar():math_expression_grammar::base_type(expression){usingnamespaceboost::spirit

c++ - Boost Spirit Qi Symbols默认值和NULL值

BoostSpiritqi::symbols实现了一个键值对映射:给一个字符串的键,它可以返回某个值。我的问题是:1)对于一个空字符串,是否可以返回一个默认值?(代码中的Q1)2)对于非空字符串或键值对映射中列出的键,是否可以返回一个值表示该键无效?(代码中的Q2)**以下代码基于BOOSTSPIRIT文档。**在此先感谢您的任何建议。#include#include#include#include#include#include#include#include#includetemplatevoidtest_parser_attr(charconst*input,Pconst&p,T

c++ - 如何从 Spirit::Qi 规则访问 boost::variant 成员?

在我的Spirit-Qi语法中,我找不到使用boost::phoenix访问boost::variant成员的正确方法。这是我想要实现的一个简单示例。(我的整个语法要复杂得多,这是我正在测试提到的问题的简单片段)。namespaceph=boost::phoenix;typedefboost::variantVariantType;typedefstd::listTlstVariants;rulerule1;rule1=qi::eps[ph::push_back(qi::_r1,ph::construct(2))]>>qi::eps[ph::get(ph::back(qi::_r1))

c++ - 使用来自 Boost.Spirit 的 Lex 和 Qi 在语法规则中使用词法分析器标记属性

让我们考虑以下代码:#include#include#include#include#include#include#include#includenamespacelex=boost::spirit::lex;namespaceqi=boost::spirit::qi;namespacephoenix=boost::phoenix;structoperation{enumtype{add,sub,mul,div};};templateclassexpression_lexer:publiclex::lexer{public:typedeflex::token_defoperator_

c++ - boost::spirit::qi Expectation Parser 和分组意外行为的解析器

我希望有人可以通过我对使用>的无知来点亮。和>>spirit解析中的运算符。我有一个工作语法,顶级规则看起来像test=identifier>>operationRule>>repeat(1,3)[any_string]>>arrow>>any_string>>conditionRule;它依靠属性自动将解析后的值分配给适合fusion的结构(即boost元组)。但是,我知道一旦我们匹配了operationRule,我们必须继续或失败(即我们不想让回溯尝试其他以identifier开头的规则)。test=identifier>>operationRule>repeat(1,3)[any