所以我试图使用Tcl_ParseExpr:解析表达式
// Any syntax errors?
Tcl_Interp *myInterpBuild;
Tcl_Parse parseInfo;
std::string expression = "(test1==1) ? 0.0) : (test2.hello+1.0)";
if (Tcl_ParseExpr(myInterpBuild,expression.c_str(),-1,&parseInfo)
== TCL_ERROR)
{
std::string failMsg = Tcl_GetStringResult(myInterpBuild);
std::cout << failMsg;
现在,通常情况下,这是有效的,并且不会出现错误。但是,如果表达式包含。(点符号),则它只解析表达式中点上方的部分。
例如,如果我将表达式设置为"(test1==1) ? 0.0) : (test2.hello+1.0)
",则只解析"test2
",并丢弃"hello
"。
上述输出为:
invalid bareword "test2"
它仅显示为在不包括点字符的情况下计算表达式。
有人知道为什么会发生这种情况吗?我该怎么做才能解决这个问题?
.
字符是,而不是目前Tcl表达式语言中的运算符。当然,它可以在浮点文字中使用,但作为运算符,它根本不是语法规则的法律部分。因此,Tcl的解析器在遇到它并抛出错误时会停止:如果您将它输入到Tcl expr
命令中,它也会执行完全相同的操作。此外,Tcl的表达式语言目前不支持裸词,除非作为函数名(还有一些关键字看起来也像裸词,如true
和false
)。
改变这一点需要重写表达式解析器,并(可能)根据Tcl的内部字节码为该运算符分配意义。这不是一件微不足道的事情(代码中有很多地方需要更改),但如果你对该做什么有很好的想法,这是可能的。如果你这样做了,请与Tcl核心团队交谈,我们会看看我们能做什么;你可能会发现我们很乐意接受一个好建议!
当然,您也可以使用自己的解析器。绝对没有什么能阻止它。