- 主题:碰到一个难题了字符串转表达式
内嵌一个lua。loadstring
时间多兴趣足,自己轮一个
【 在 anything1999 的大作中提到: 】
: 程序里面有lambda表达式,这个表达式诸如y=3+x, 其中这个3+x部分想让用户输入,用户也可以输入3*x等,然后把用户输入的字符串转为表达式,以便后续计算,之前c#有第三方库,python之类的也有eval函数(这个可能还不太一样,我不需要立即求值),c++没有找到类似的功能或者库。
: 各位有什么思路
--
FROM 124.114.151.*
实际上不是求值的事情,而是把字符串变成表达式(lambda或者std::function),不是立即求值,而是运行时输入x进去再求表达式的值。比如3+x,运行时给出x=10,也可能给出100, 99都行。
不知道我讲明白没有。
【 在 KillnCov 的大作中提到: 】
: 表达式求值不都是用经典的逆波兰式么?操作符和操作数分解的清清楚楚。几十行代码的事。
:
--
FROM 124.64.16.*
实际上不是求值的事情,而是把字符串变成表达式(lambda或者std::function),不是立即求值,而是运行时输入x进去再求表达式的值。比如3+x,运行时给出x=10,也可能给出100, 99都行。
不知道我讲明白没有。
【 在 allegro 的大作中提到: 】
: 你有木有刷过leetcode,这种表达式求值都有固定模板的。
--
FROM 124.64.16.*
这个有点意思,我用一用。
【 在 meizhi 的大作中提到: 】
: exprtk很香
: 发自「今日水木 on 22041216C」
--
FROM 124.64.16.*
实际上不是求值的事情,而是把字符串变成表达式(lambda或者std::function),不是立即求值,而是运行时输入x进去再求表达式的值。比如3+x,运行时给出x=10,也可能给出100, 99都行。
不知道我讲明白没有。
【 在 e729 的大作中提到: 】
: 把这个表达式写到一个.c文件中,fork新的进城编译执行它,取得结果。
: 以上是十数年前,本老某个学期面对的最后一道C大作业题受挫时,给自己预备的的最后一招
:
--
FROM 124.64.16.*
你如果就是要解析这个表达式,只用C++,其实还是要学很多东西的,花的时间比较久。
你要想学有兴趣有时间,那OK,版友们已经有比较多的方案了。
你要是不想学没时间只是为了完成工作,那你就用python或lua或什么其它你熟悉的可以
嵌入到C++里的语言就是了,先把字符串保存下来,运行时调用python来动态计算,pyt
hon支持在运行时给定x的值。
【 在 anything1999 的大作中提到: 】
: 实际上不是求值的事情,而是把字符串变成表达式(lambda或者std::function),不是立即求值,而是运行时输入x进去再求表达式的值。比如3+x,运行时给出x=10,也可能给出100, 99都行。
: 不知道我讲明白没有。
--
FROM 58.33.81.*
内嵌python
【 在 anything1999 的大作中提到: 】
: 程序里面有lambda表达式,这个表达式诸如y=3+x, 其中这个3+x部分想让用户输入,用户也可以输入3*x等,然后把用户输入的字符串转为表达式,以便后续计算,之前c#有第三方库,python之类的也有eval函数(这个可能还不太一样,我不需要立即求值),c++没有找到类似的功能或者库。
: 各位有什么思路
--
FROM 61.149.143.*
我知道,逆波兰式实现就是一个堆栈。不管什么方案,最终计算都是用逆波兰式。所以一步到位。
你把变量和名称另外用一个string val map存储起来不就完事了。
【 在 anything1999 的大作中提到: 】
: 实际上不是求值的事情,而是把字符串变成表达式(lambda或者std::function),不是立即求值,而是运行时输入x进去再求表达式的值。比如3+x,运行时给出x=10,也可能给出100, 99都行。
:
: 不知道我讲明白没有。
: ...................
--来自微微水木3.5.12
--
FROM 140.206.195.*
用户输入表达式,检查表达式合法性,若非法提示并要求重新输入或者直接退出;如果合法,则提示并等待用户输入变量值,用户输入后,检查值的合法性,当一切正常时,你有了一个没有未知数的表达式,你就fopen创建一个.c文件,内容为:
#include<xxx>
int main()
{
double x = 你的表达式;
printf("%f\n", x);
return 0;
}
调用fork,在子进程中execl("gcc", ......)编译刚刚的c文件,再execl(....)运行刚刚得到的可执行二进制文件;父进程简单地等待子进程的返回即可
不知道我说清楚了没有
【 在 anything1999 的大作中提到: 】
: 实际上不是求值的事情,而是把字符串变成表达式(lambda或者std::function),不是立即求值,而是运行时输入x进去再求表达式的值。比如3+x,运行时给出x=10,也可能给出100, 99都行。
: 不知道我讲明白没有。
--
FROM 119.114.248.*
嵌python是一个办法,但又两个问题:
1. 参数值是由c++程序提供,而且调用非常频繁,是否影响效率
2. 是不是要安装python运行时?
【 在 RunningOn 的大作中提到: 】
: 你如果就是要解析这个表达式,只用C++,其实还是要学很多东西的,花的时间比较久。
:
: 你要想学有兴趣有时间,那OK,版友们已经有比较多的方案了。
: ...................
--
FROM 114.249.195.*