📄 expression类使用说明.txt
字号:
LR算术表达式解析器使用说明(V2.0)
本算术表达式解析器支持的运算符号包括: +, -, *, /, ^, (, ), ;, =
支持的函数包括:sin, cos, tan, sinh, cosh,tanh, asin, acos, atan, exp,
abs, ln/log, lg/log10, sqr, trunc
数字:可以是整型,如1, 4;
可以是浮点型,如0.234, -12.4;
可以是pi,Pi,pI,PI,这些都将当作圆周率3.1415926;
可以是科学计数法,如3.0E+10,1.6E-19; 但E后面的数字只能有4位,
例如:3.0E+12345将视为2个数(3.0E+1234和5)并产生语法错误.
标识符:可以是以字母开头的任意字母与数字的组合.如x1, asdf, sin12等.
功能:
1 可以输入赋值语句,如 x=1+2*sin(pi/2),将输出: x = 3;
2 可以只输入表达式,如 1/2+ 1.0E-2,这将默认为ans=1/2+ 1.0E-2, 并输出: ans = 0.51
3 可以输入多个赋值语句.多个赋值语句之间必须用分号隔开,后面的语句可以引用前面赋值语句得到的
标识符的值.如 x1=1+2;x2=2; y=cos(0)+x1*x2, 将输出: y = 7
1*3; y=ans/9 将输出: y = 0.333 因为前面的语句默认为:ans =1*3
4 如果表达式有错,将报错并给出错误的地方和类型. 如:
a)输入 1+(2+(3+4) 将输出: 表达式非法结束,可能缺少括号 ),或以操作符+,*,^,(等结尾!
b)输入 x1 =2 ;y=2*x; 将输出:错误! 在表达式的第12个字符处出现了没有定义的标识符 x
c)输入 x =1+2(-3) 将输出:错误! 在表达式的第12个字符处出现了不合语法的符号 (
类Expression主要几个函数的用法与注意点:
Expression(string exp); 构造表达式为exp的表达式对象
void setExpression(string exp); 改变已有的表达式对象的表达式内容,并清除idMap中的值.
void parse(void);计算表达式,把出错信息或结果保存在resultStr中.并且把标识符的值保存
到idMap中.
void setId(string idName, double val); 添加值为val,名称为idName的标识符.例如你可以直接
令表达式为x=2;y=sin(x) 也可以令表达式为:y=sin(x),并且在parse()前调用
setId(x,2),两者效果一样. 注意:setId(idName)应该在setExpression(string)之后!
因为setExpression(string exp)会清除setId(idName)设置的值
double getID(string idName);得到名称为idName的标识符的值,但必须判断表达式是否出错,既
parseSucc是否为ture.还得保证idName在表达式中出现.
string getResult(void) 返回出内容为错信息或最后一个赋值语句的值的字符串.
类Expression的用法:
例1:下面的程序的功能是对你输入的表达式给出结果或出错理由,当输入exit时退出.
#include ".\Expression.h"
#include<iostream>
using namespace std;
void main()
{ string str;
Expression exp;
cout << "输入表达式(exit退出):";
getline(cin,str,'\n');
while(str != "exit")
{ exp.setExpression(str);
exp.parse();
cout <<exp.getResult() <<endl;
cout << "\n输入表达式(exit退出):";
getline(cin,str,'\n');
}
}
例2:下面的程序的功能是对任意输入的y = f(x)计算出在x =1,2,...10时,y的值.
#include ".\Expression.h"
#include<iostream>
using namespace std;
void main()
{
string str;
double fx[10];
Expression exp;
cout << "输入y=f(x)的表达式(如y=x^2):";
getline(cin,str,'\n');
exp.setExpression(str);
for(int i=1; i<=10; i++)
{ exp.setId("x",i);
exp.parse();
if(exp.parseSucc) fx[i-1] = exp.getId("y");
}
for(int j=0; j<10; j++)
cout<<"y = f("<<j+1<<") = "<<fx[j]<<endl;
}
本LR算术表达式解析器的语法:
1 S’ -> S 9 T -> T/F
2 S -> S;A 10 T -> F
3 S -> A 11 F -> (E)
4 A -> ID=E | E 12 F -> ID
5 E -> E+T 13 F -> NUM
6 E -> E-T 14 F -> -F
7 E -> T 15 F -> FUNC(E)
8 T -> T*F 16 F -> F^F
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -