C++ 函数,它解析字符串并相应地设置变量

C++ 函数,它解析字符串并相应地设置变量,c++,C++,我想用C语言编写一个简单的脚本语言++ 打完电话 string statement = "Set anObject.subObject.PublicVariable 10"; execute(statement); 执行就行了 anObject.subObject.PublicVariable = 10; 我怎么能做那样的事? 我不知道怎么做(除了处理每个变量的switch/case,但这太低效和愚蠢了)。如果您只打算使用set的基本命令,那么您可能可以这样做 class BaseClass

我想用C语言编写一个简单的脚本语言++

打完电话

string statement = "Set anObject.subObject.PublicVariable 10";
execute(statement);
执行就行了

anObject.subObject.PublicVariable = 10;
我怎么能做那样的事?
我不知道怎么做(除了处理每个变量的switch/case,但这太低效和愚蠢了)。

如果您只打算使用
set
的基本命令,那么您可能可以这样做

class BaseClass {
    vector<string> objects;
    vector<void*> locationOfObjects;
    ...
}
类基类{
矢量对象;
物体的矢量定位;
...
}

提交命令后,通过该类中的字符串向量进行交互,找到要设置的对象的位置(对于子对象,可以在字符串中循环,继续查找要设置的目标对象的位置),然后将该对象设置为某个值。请注意,每个类都需要是基类的子类,以便每个对象或子对象都可以迭代对象。

如果希望脚本语言保存自己的变量:

struct variable {
    std::map<std::string, variable> children;
    int value;

    variable() : value(0) {}
    variable(int rhs) : value(rhs) {}
    variable(const variable& rhs) : children(rhs.children), value(rhs.value) {}

    operator=(int rhs) {value = rhs; return *this;
    variable& operator[](const std::string& rhs) {return children[rhs];}
};
struct变量{
地图儿童;
int值;
变量():值(0){}
变量(int rhs):值(rhs){}
变量(const variable&rhs):子级(rhs.children),值(rhs.value){}
运算符=(int-rhs){value=rhs;返回*this;
变量和运算符[](const std::string和rhs){返回子项[rhs];}
};

<>如果你想用脚本语言修改C++变量,你必须像丹齐姆的显示一样登记它们。

< P>你可能不能。

如果我正确地猜测您希望“脚本”搜索名为
anObject
的对象,则获取其字段
subObject
,并将其字段
PublicVariable
设置为10


当然,你可以很努力地让用户相信,代码是这样做的,但是一旦你编译了一个C++程序,变量和函数名就消失了,它们就变成了地址(有很多东西叫做调试符号,但这不是真正的C++……),并且类型只存在于编译器中,而不存在于正在运行的程序中。因此,如果您希望在action script中使用类似于
eval()
的东西,则没有!我将此作为Boost Spirit的练习


以下是更古老、更简单(更现实…)的示例:

更新 我把厨房的水槽()放进去,以防你真的想要一个完整的层次结构:

struct object
{
    std::string name;
    // non-key:
    mutable variant_t value;
    mutable std::set<object> children;
    // ...
};
输入

Set bla.blo 123
Set veryLong.subObject.stringVal "hello"
Set veryLong.subObject 31415926E-7
Set answer 42
Set bla.blo "world"
输出是

name: <globals>
{
    name: answer (value: 42)
    {
    }
    name: bla
    {
        name: blo (value: world)
        {
        }
    }
    name: veryLong
    {
        name: subObject (value: 3.14159)
        {
            name: stringVal (value: hello)
            {
            }
        }
    }
}
名称:
{
名称:答案(值:42)
{
}
姓名:bla
{
名称:blo(值:world)
{
}
}
姓名:veryLong
{
名称:子对象(值:3.14159)
{
名称:stringVal(值:hello)
{
}
}
}
}

还没有,但我尝试用谷歌搜索我的答案,找到了像Yacc和Bison这样的解析器创建者。但这并没有解决我的问题。解析是这里最简单的部分。但首先,我必须用指针和字符串填充这个查找表,然后从(void*)强制转换对于类型-肯定比switch/case更好。我建议用
map
替换这两个向量。然后将该映射拆分为
map
map
,以确保类型安全
typedef boost::optional<boost::variant<std::string, double, int> > variant_t;
Set bla.blo 123
Set veryLong.subObject.stringVal "hello"
Set veryLong.subObject 31415926E-7
Set answer 42
Set bla.blo "world"
name: <globals>
{
    name: answer (value: 42)
    {
    }
    name: bla
    {
        name: blo (value: world)
        {
        }
    }
    name: veryLong
    {
        name: subObject (value: 3.14159)
        {
            name: stringVal (value: hello)
            {
            }
        }
    }
}