我正在编写一个小型解释器,用于简单的BASIC语言,使用avr-gcc工具链在C语言的AVR微控制器上练习.但是,我想知道是否有任何开源工具可以帮助我编写词法分析器和解析器.
如果我写这个在我的Linux机器上运行,我可以使用flex/bison.现在我把自己限制在一个8位平台上,我必须手动完成所有操作,不是吗?
首先,如果使用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) 大家好,我是新手,以提升和提升::精神,所以我很抱歉没有问题.
当我使用qi::phrase_parse函数时,该函数只返回bool变量,它指示解析是否成功,但我不知道在哪里可以找到解析的结果...某种语法树等.
如果我使用宏的#define BOOST_SPIRIT_DEBUGXML表示在标准输出上打印树,但这些节点必须存储在某处.你能帮我吗?
我即将为类似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 ++中找到了一个关于布尔转换器,*布尔表达式(语法)解析器的非常好的例子
我现在在想的是做一个进一步的步骤,转换(!T|F)&T成F或者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) 我试图简单地在这个答案中找到精神解析器:
删除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) 我有一个 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++字符串,如"true &&(false || true)"
需要评估此字符串.在PHP中,我们使用eval函数来实现这一点.我们如何在C++中实现这一目标?