求救,如何获得表达式里的变量名:"A1+1.2+A2.f[2]"把:"A1","A2.f[2]"取出来。高手救我!

哈士奇打嘴仗 2004-12-08 10:46:43
求救,如何获得表达式里的变量名:"A1+1.2+A2.f[2]"把:"A1","A2.f[2]"取出来高手救我!
从表达式里获得变量名,变量可能是对象的一个属性。 主要考虑 变量名中可以有数字,也有可能是数组
C++ 里 : string expr= "A1+1.2+A2.f[2]+A3.data+A4[5]";
vecter<string> array = getVariantTables(expr);//返回string[]也可以。
A1
A2.f[2]
A3.data
A4[5]
是 A3.f[1][2]二维的可能性很小。
A[i][j]数组的下标是固定的,ij不允许出现。



...全文
131 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈士奇打嘴仗 2004-12-08
  • 打赏
  • 举报
回复
这是为了解决数字表达式值用的。“1+2”=3我已经解决了。
现在要把变量替换成数字。
"a+2" a=4 返回 6
"a[2]+2" a[2]=8 返回 10
取得变量数值getvalue("a[2]");这方法已经有了。
现在就不知道变量名
polarman 2004-12-08
  • 打赏
  • 举报
回复
就你给的表达式看来不是数字就是变量了
先根据操作符进行分词,然后判断每个词是否是数字就行了
piaozi2003 2004-12-08
  • 打赏
  • 举报
回复
写出正则表达式,再画出DFA

这个应该比较简单
truewill 2004-12-08
  • 打赏
  • 举报
回复
先找本<编译原理>看看....
Visual_Li 2004-12-08
  • 打赏
  • 举报
回复
不懂啊!?
哈士奇打嘴仗 2004-12-08
  • 打赏
  • 举报
回复
我自己写的,如果是数字表达式的话,这样就可以把变量名取出来了。
上面的变量名中的空格还需要去掉,我没有写trim(),trim代码太多了。

哈士奇打嘴仗 2004-12-08
  • 打赏
  • 举报
回复
#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
#include <math.h>
using namespace std;
typedef vector <string> VerArray;
/**
* 是否为操作符,非操作符=0 ,算术符=1,逻辑符号=2
*/
int isOpertor(char c){
int r = 0;
switch (c){
case '+':
case '-':
case '*':
case '/':
case '%':
case '(':
case ')':
r = 1;
break;
case '>':
case '<':
case '=':
case '&':
case '|':
case '!':
r = 2;
break;
default:
r = 0;
break;
}
return r;
}
// <= >= != == && ||是双符号逻辑符号,不包含 += *= -= ++ --等双运算符
bool islogic(char la ,char cu){
bool r = (la== cu)?(cu=='&'||cu=='|'||cu=='='):false;
bool t = (cu=='=')?(la=='>'||la=='<'||la=='!'):false;
return r||t;
}
bool isnumber(string st){
const char * p;
p = st.c_str();
char ch;
while(*p!='\0'){
ch = *p++;
if(ch=='.'||ch==' '){
continue;
}
if(!isdigit(ch))
return false;
}
return true;
}
//如果是字符串数值的不加 字符串: 'a3'
void addVeriant(string v,VerArray* va){
//v = trim(v);
int ls=v.size()-1;
if(ls < 0 || v.at(0)=='\''||v.at(ls)=='\''){
cout<< "string:"<<v<<endl;
return;
}
va->insert(va->end(),v);
}

void getVeriant(string str,VerArray* va){
const char * p;
p = str.c_str();
int len = str.size();
int his=0;//两个下标
int pre=0;
string v = "";
char ch;
for(pre=0;pre<len;p++,pre++){
ch = *p;
if(isOpertor(ch)){
if(pre-his){//双符号忽略
v = str.substr(his,pre-his);
if(!isnumber(v)){
addVeriant(v,va);
cout<<"veriant:"<<v<<endl;
}else
cout<<"isnumber:"<<v<<endl;
}
his = pre + 1;
};
}
if(pre-his){//取最后一笔
v = str.substr(his);
if(!isnumber(v)){
addVeriant(v,va);
cout<<"veriant:"<<v<<endl;
} else
cout<<"isnumber:"<<v<<endl;
}
}

int main(int argc, char *argv[])
{
string str="A1.f[1] > A2.y && (v3 - 46 <= 5.6+ 0.23)";
cout << "string=" << str <<endl;
char * ch;
cout << isnumber("d1.3")<<endl;
cout <<islogic('!','=')<<endl;
VerArray va;
getVeriant(str,&va);
system("PAUSE");
return 0;
}

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧