【原创源码】C#编写一款自己的脚本语言.第六章.下
第六章.下此章为代码章。
已经写成了类。建议你自己写一个,这样大脑才会活跃,兴奋。
能够解决:没有括号的运算,运算符号有“^*/%+-”,当然,你也可以自己添加一些运算符号
——————————
下一章,将会涉及括号的运算
用的都是自己想的方法,有可能不是最优的方法,抱歉。
在无括号运算方面,有些朋友提出了一些公认的好方法:
1、逆波兰
2、树(这个不是特别清楚,我尚未验证)
——————————
为什么我还在执着自己想的方法呢?而不用前辈想好的方法呢?
因为这样大脑才异常兴奋。
——————————
using System;
using System.Collections.Generic;
namespace ScriptCode
{
public class ScriptCodeU
{
/*
*/
public string Eval(string myScript)
{
return eval_basicElement(myScript);
}
//
private string eval_basicElement(string myScript)
{
string myResult;
//-----
/*定义储存变量*/
string LeftVar = string.Empty;//左变量
string RightVar = string.Empty;//右变量
string unRunCode = string.Empty;//非执行代码
bool SwitchOfRun = false;//运算开关
char nowRunChar = char.MinValue;//当前运算符号
string cmdResult;//计算结果
/*定义优先级*/
List<string> rankRunChar = new List<string>();
rankRunChar.Add("^");
rankRunChar.Add("*/%");
rankRunChar.Add("+-");
/*前期准备*/
string tempScript = myScript;
/*正式执行*/
for(int c=0;c<rankRunChar.Count; c++)
{
for (int i = 0; i < tempScript.Length; i++)
{
int CharType = judgeChar(tempScript, rankRunChar.ToArray(), c);//你们可以具体看一下judgeChar的函数,不然有可能不能理解
if (CharType == 0)
{//如果为:非当前优先级运算符号
if (SwitchOfRun)
{
//如果运算开关为真
cmdResult = cmd(nowRunChar, LeftVar, RightVar);
unRunCode += cmdResult+tempScript;
LeftVar = string.Empty;
RightVar = string.Empty;
SwitchOfRun = false;
}
else
{
//如果运算开关为假
unRunCode += LeftVar;
LeftVar = string.Empty;
unRunCode += tempScript;
}
}
else if (CharType == 1)
{//当前优先级运算符号
if (SwitchOfRun)
{
cmdResult = cmd(nowRunChar, LeftVar, RightVar);
LeftVar = string.Empty;
LeftVar += cmdResult;
RightVar = string.Empty;
SwitchOfRun = true;
nowRunChar = tempScript;
}
else
{
//如果运算开关为假
SwitchOfRun = true;
nowRunChar = tempScript;
}
}
else if (CharType == 2)
{
//数值
if (SwitchOfRun)
{
//如果运算开关为真
RightVar += tempScript;
}
else
{
//如果运算开关为假
LeftVar += tempScript;
}
}
}
//做最后一次运算
if (SwitchOfRun)
{
cmdResult = cmd(nowRunChar, LeftVar, RightVar);
unRunCode += cmdResult;
}else
{
unRunCode +=LeftVar;
}
//递交给下一次计算
tempScript = unRunCode;
//重置
unRunCode = string.Empty;
LeftVar = string.Empty;
RightVar = string.Empty;
SwitchOfRun = false;
nowRunChar = char.MinValue;
cmdResult = string.Empty;
}
myResult = tempScript;
//-----
return myResult;
}
/*与运算符号相对应的运算函数,加+减-乘*除/取余%次方^*/
private string plues(string X,string Y)
{
string Z;
//-----
double lx = double.Parse(X);
double ly = double.Parse(Y);
Z = (lx + ly).ToString();
//-----
return Z;
}
private string minus(string X,string Y)
{
string Z;
//-----
double lx = X .Length !=0?double.Parse(X):0;
double ly = double.Parse(Y);
Z = (lx - ly).ToString();
//-----
return Z;
}
private string multiply(string X,string Y)
{
string Z;
//-----
double lx = double.Parse(X);
double ly = double.Parse(Y);
Z = (lx * ly).ToString();
//-----
return Z;
}
private string divide(string X,string Y)
{
string Z;
//-----
double lx = double.Parse(X);
double ly = double.Parse(Y);
Z = (lx / ly).ToString();
//-----
return Z;
}
private string module(string X,string Y)
{
string Z;
//-----
double lx = double.Parse(X);
double ly = double.Parse(Y);
Z = (lx % ly).ToString();
//-----
return Z;
}
private string pow(string X,string Y)
{
return Math.Pow(double .Parse (X),double .Parse (Y)).ToString ();
}
/*统一运算,根据运算符号进行运算*/
private string cmd(char myCmd,string X,string Y)
{
string myResult = string.Empty;
//-----
switch (myCmd)
{
case '+':
myResult = plues(X ,Y);
break;
case '-':
myResult = minus(X,Y);
break;
case '*':
myResult = multiply(X,Y);
break;
case '/':
myResult = divide(X,Y);
break;
case '%':
myResult = module(X,Y);
break;
case '^':
myResult = pow(X,Y);
break;
}
//-----
return myResult;
}
/*判断字符类型*/
private int judgeChar(char myChar, string[] myRunChar, int myRank)
{
/*
myChar就是字符
myRunChar就是你定义的运算符号,就是上面的rankRunChar
myRank就是当前的优先级,"^","*/%","+-"的优先级不一样,在rankRunChar里面的下标分别是0,1,2.如果myRank=0,那么当myChar为'^'时就会返回
*/
/*
0:非当前优先级运算符号
1:当前优先级运算符号
2:数值
3:未知符号
4:
*/
int myResult =3;
//-----
if ((myChar >= '0' && myChar <= '9')||myChar =='.')
{
myResult = 2;//数值
}
bool isRunChar = false;
for (int i = 0; i < myRunChar.Length; i++)//如果符号是运算符号,才会判断该符号是当前优先级还是不是当前优先级
{
if (myRunChar.IndexOf(myChar) != -1)
{
isRunChar = true;
break;
}
}
if (isRunChar)
{
if (myRunChar.IndexOf(myChar) != -1)
{
myResult = 1;
}
else
{
myResult = 0;
}
}
//-----
return myResult;
}
}
}
附上之前章节地址:
第一章:http://www.52pojie.cn/thread-470085-1-1.html
第二章:http://www.52pojie.cn/thread-470424-1-2.html
第三章:http://www.52pojie.cn/thread-471306-1-1.html
第四章:http://www.52pojie.cn/thread-471637-1-1.html
第五章:http://www.52pojie.cn/thread-471937-1-1.html
第六章:http://www.52pojie.cn/thread-472899-1-1.html
感谢支持 其实楼主这样也是挺好的,能自己独立思考,而不去用前人已经为我们想好的思路。现在就是缺的这种人。
虽然楼主写出来的不是最优解,但是肯定比那些借用前人思想的人来说进步了很多,楼主加油! 支持楼主支持吾爱{:17_1064:} 技术含量不高,但是对于新手来说是很好的。
楼主继续努力 谢谢楼主分享,学习了 楼主真好啊,如果没猜错的话,楼主也是学生把 支持楼主 E式丶男孩 发表于 2016-3-12 08:56
楼主真好啊,如果没猜错的话,楼主也是学生把
哈哈,被你猜对了。大一。 膜拜大神,吾等渣渣向LZ看齐{:17_1070:}
页:
[1]
2