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核心团队交谈,我们会看看我们能做什么;你可能会发现我们很乐意接受一个好建议!
当然,您也可以使用自己的解析器。绝对没有什么能阻止它。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 即使使用调试编译标志,表达式也是"optimized out"
- 如何考虑在正则表达式中以DOT为单位
- 正则表达式不允许在 dot(.) 之后立即写入 dot(.)
- Tcl_ParseExpr 不会解析包含 'dot' 的表达式