相关疑难解决方法(0)

是否有可用于8位嵌入式系统的flex/bison的替代方案?

我正在编写一个小型解释器,用于简单的BASIC语言,使用avr-gcc工具链在C语言的AVR微控制器上练习.但是,我想知道是否有任何开源工具可以帮助我编写词法分析器和解析器.

如果我写这个在我的Linux机器上运行,我可以使用flex/bison.现在我把自己限制在一个8位平台上,我必须手动完成所有操作,不是吗?

embedded parsing bison avr-gcc flex-lexer

80
推荐指数
3
解决办法
6万
查看次数

在Spirit中构建自定义表达式树:Qi(没有Utree或Boost :: Variant)

首先,如果使用Boost Variant或Utree更容易,那么我将与他们达成和解,我将尝试在另一个主题中解决我们的问题.但是,我非常希望能够像下面一样构建一棵树.

背景,如果你想直接讨论这个问题,请忽略:我希望能够构建一个解析像

"({a} == 0) && ({b} > 5)"
Run Code Online (Sandbox Code Playgroud)

或标准的数学表达式

"(2 * a) + b"
Run Code Online (Sandbox Code Playgroud)

然后我将在评估树之前定义a和b是什么,如下所示:

a = 10;
double val = myExpression->Evaluate();
Run Code Online (Sandbox Code Playgroud)

我的问题来自于当我尝试构建try以将字符串解析为我的表达式树时.我正在使用一个抽象类"Expression",然后导出"变量","常量"和"二进制"表达式(它也会做一元,但它不应该影响我的问题.我一直有使用我的规则添加到树的问题所以我显然做错了什么.我很难绕着属性缠头.

我的树如下(Tree.h):

class BinaryExpression;
typedef double (*func)(double, double);

class Expression
{
public:
    virtual double Evaluate() = 0;
};

class BinaryExpression : public Expression
{
private:
    Expression* lhs;
    Expression* rhs;
    func method;

    double Evaluate();

public:
    BinaryExpression(void);
    BinaryExpression(char op, Expression* lhs, Expression* rhs);
    BinaryExpression(char op);
    void operator()(Expression* lhs, Expression* rhs);
};

class ConstantExpression : public Expression
{
private: …
Run Code Online (Sandbox Code Playgroud)

c++ parsing expression-trees boost-spirit boost-spirit-qi

7
推荐指数
1
解决办法
2593
查看次数

Boost :: phrase_parse的精神结果

大家好,我是新手,以提升和提升::精神,所以我很抱歉没有问题.

当我使用qi::phrase_parse函数时,该函数只返回bool变量,它指示解析是否成功,但我不知道在哪里可以找到解析的结果...某种语法树等.

如果我使用宏的#define BOOST_SPIRIT_DEBUGXML表示在标准输出上打印树,但这些节点必须存储在某处.你能帮我吗?

c++ parsing boost-spirit

5
推荐指数
1
解决办法
4965
查看次数

是否允许使用递归提升精神语法?

我即将为类似mathematica的语言编写一个解析器,并且已经发现,有时会调用我的精神语法来解析表达式的子部分.

即如果我要解析

a+b*c+d 
Run Code Online (Sandbox Code Playgroud)

parse()在查询"+"符号时调用'b*c'部分会很方便.

使用同一个语法实例时可以这样做吗?(语法参数为'*this')

虽然我还不完全相信这是否是完成这项特定任务的最佳方式,但我发现这个问题相当有趣,因为我在文档中找不到任何内容.

如果我使用这种技术,我不应该依赖于类本地变量或全局变量.但我想知道它是否主要由精神设计所允许.

编辑:

我的语法实例如下:

class MyGrammar : public boost::spirit::qi::grammar<...>  
{  
    /* a few rules. Some with local and/or inherited attributes */  
    MyGrammar( void )  
    {
         /* assign all the rules, use a few 'on_error' statements */
         // In one or two rules I would like to invoke parse(...,*this,...)  
         // on a subrange of the expression
    }
}  
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++ boost boost-spirit

5
推荐指数
1
解决办法
2064
查看次数

如何计算Spirit中的布尔表达式

在c ++中找到了一个关于布尔转换器,*布尔表达式(语法)解析器的非常好的例子

我现在在想的是做一个进一步的步骤,转换(!T|F)&TF或者0,这样计算一个很长的布尔表达式非常方便.

有一些使用精神的例子吗?我所做的是首先制作一个计算器,然后让它计算'(T +!F*T)',它等于(T||!F&&T)但是当我输入时(),有一个错误.如何修改?非常感谢!

#include <iostream>  
#include <stack>  
#include <boost/lexical_cast.hpp>  
#include <boost/config/warning_disable.hpp>  
#include <boost/spirit/include/qi.hpp>  
#include <boost/spirit/include/phoenix.hpp>  

using namespace std;  
namespace phoenix = boost::phoenix;  
namespace qi = boost::spirit::qi;  
namespace ascii = boost::spirit::ascii;  

struct calculator  
{  
    bool interpret(const string& s);  
    void do_neg();  
    void do_add();  
    void do_sub();  
    void do_mul();  
    void do_div();  
    void do_number(const char* first, const char* last);  
    int val() const;  
private:  
    stack<int> values_;  
    int *pn1_, n2_;  
    void …
Run Code Online (Sandbox Code Playgroud)

c++ boost-spirit boolean-operations

4
推荐指数
1
解决办法
2482
查看次数

使用 Boost 的布尔表达式

我试图简单地在这个答案中找到精神解析器:

删除xor运算符和逻辑。我看不到怎么做,我尝试使用

expr_  = or_.alias();

or_  = (and__ >> "or"  >> or_ )[ _val = phx::construct<binop<op_or >>(_1, _2) ]     | and_   [ _val = _1 ];
and_ = (not_ >> "and" >> and_) [ _val = phx::construct<binop<op_and>>(_1, _2) ] | not_   [ _val = _1 ];
not_ = ("not" > simple       ) [ _val = phx::construct<unop <op_not>>(_1)     ] | simple [ _val = _1 ];
Run Code Online (Sandbox Code Playgroud)

对于规则定义,但我收到一条我不明白的神秘编译器消息:

test\test.cpp `boost::spirit::_2' cannot appear in a constant-expression
Run Code Online (Sandbox Code Playgroud)

如果有人能阐明一些观点,我将不胜感激。

这是日志:

compiler: …
Run Code Online (Sandbox Code Playgroud)

c++ parsing boost boost-spirit boost-spirit-qi

2
推荐指数
1
解决办法
1723
查看次数

如何在C++或C中将字符串转换为条件表达式

我有一个 string

string expression=((true AND true)OR false); 
Run Code Online (Sandbox Code Playgroud)

如何将其string转换为条件语句,以便我可以在if语句中使用它,即

if((true AND true)OR false))
Run Code Online (Sandbox Code Playgroud)

就像eval在JavaScript中一样- C++或C中是否有API?

c c++

0
推荐指数
1
解决办法
1694
查看次数

在C++中将字符串评估为布尔值

我在评估后得到一个C++字符串,如"true &&(false || true)"

需要评估此字符串.在PHP中,我们使用eval函数来实现这一点.我们如何在C++中实现这一目标?

c++

0
推荐指数
1
解决办法
3733
查看次数