Tcl_ParseExpr 不解析其中包含 'dot' 的表达式
Tcl_ParseExpr does not parse expression with 'dot' in it
所以我尝试使用 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 核心团队联系,我们将看看我们能做些什么;您可能会发现我们很容易接受好的建议!
当然,您也可以使用自己的解析器。绝对没有什么能阻止它。
所以我尝试使用 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 核心团队联系,我们将看看我们能做些什么;您可能会发现我们很容易接受好的建议!
当然,您也可以使用自己的解析器。绝对没有什么能阻止它。