Tcl_ParseExpr 不会解析包含 'dot' 的表达式

Tcl_ParseExpr does not parse expression with 'dot' in it

本文关键字:dot 表达式 包含 ParseExpr Tcl      更新时间:2023-10-16

所以我试图使用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的表达式语言目前不支持裸词,除非作为函数名(还有一些关键字看起来也像裸词,如truefalse)。

改变这一点需要重写表达式解析器,并(可能)根据Tcl的内部字节码为该运算符分配意义。这不是一件微不足道的事情(代码中有很多地方需要更改),但如果你对该做什么有很好的想法,这是可能的。如果你这样做了,请与Tcl核心团队交谈,我们会看看我们能做什么;你可能会发现我们很乐意接受一个好建议!

当然,您也可以使用自己的解析器。绝对没有什么能阻止它。