⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expression类使用说明.txt

📁 能计算如下表达式:x=3 y=4 z=x^2+sin(y)
💻 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 + -