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