当前位置: 首页 > 编程语言 > C#

解析数学表达式分享

时间:2023-04-11 12:05:18 C#

解析数学表达式给定一个包含数学表达式的字符串,给定一组函数/命令,给定一组赋值变量,.NET是否提供快速构建分析工具?我想构建一个简单的解析器来分析表达式并将其分解为最简单的组件,例如:d*(abs(ab)+sqrt(c))变为f=abs(ab)和g=sqrt(c)e=f+gd*e参见veparser。下面的示例代码演示了如何构建表达式求值器(解析表达式并直接计算输出的代码)。可以修改此示例以存储评估树而不是运行它。使用系统;使用VeParser;公共类MathEvaluator:CharParser{protectedoverrideParserGetRootParser(){FuncproductFunc=(value1,value2)=>value1*value2;FuncdivideFunc=(value1,value2)=>value1/value2;FuncsumFunc=(value1,value2)=>value1+value2;FuncsubtractFunc=(value1,value2)=>value1-value2;FuncnegativeFunc=value=>-value;FuncpositveFunc=value=>value;vardot=token('.');varop=token('(');varcp=token(')');varsumOp=create(sumFunc,token('+'));varsubtractOp=create(subtractFunc,token('-'));varpositiveOp=create(posititveFunc,token('+'));varnegativeOp=create(negativeFunc,token('-'));varproductOp=create(productFunc,token('*'));vardivideOp=create(divideFunc,token('/'));//数字vardeciamlPlaceValue=1M;vardecimalDot=run(()=>{deciamlPlaceValue=1;},点);vardigit=consume((n,d)=>n*10+char.GetNumericValue(d),keep(Digit));vardecimalDigi数字t=consume((n,d)=>{deciamlPlaceValue=deciamlPlaceValue*10;return(double)((decimal)n+((decimal)char.GetNumericValue(d))/deciamlPlaceValue);},keep(Digit));varnumber=any(/*float*/create(0,seq(zeroOrMore(digit),decimalDot,oneOrMore(decimalDigit))),/*int*/create(0,oneOrMore(digit)));var表达式=createReference();varsimpleExpression=createReference();//一元变量unaryOp=any(positiveOp,negativeOp);varunaryExpression=update(d=>d.action(d.value),createNew(seq(set("action",unaryOp),set("value",expression))));//二进制变量binaryOp=any(sumOp,subtractOp,productOp,divideOp);varbinaryExpressinoTree=update(x=>x.value1,createNew(seq(set("value1",simpleExpression),zeroOrMore(update(d=>{varr=base.CreateDynamicObject();r.value1=d.action(d.value1,d.value2);返回r;},seq(set("action",binaryOp),set("value2",simpleExpression)))))));varprivilegedExpressoin=seq(op,express离子,cp);setReference(simpleExpression,any(privilegedExpressoin,unaryExpression,number));setReference(expression,any(binaryExpressinoTree,simpleExpression));返回序列(表达式,endOfFile());}publicstaticobjectEval(stringexpression){MathEvaluatorme=newMathEvaluator();varresult=me.Parse(expression.ToCharArray());返回结果;你想构建一个解析器还是只提供一个解决方案?无论哪种方式,如果您只需要解决它,请查看nCalc并获取二进制文件。如果您需要查看它们如何解析表达式树,请获取源代码。我听说过有关Grammatica解析器生成器的好消息。ANTLR也被广泛使用(尤其是在Java中)。我假设您知道如何定义BNF语法并且过去知道或构建过解析器。上面的另一个Aproach是C#学习教程:解析数学表达式分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——classProgram{staticvoidMain(string[]args){vara=1;变量b=2;Console.WriteLine(FN_ParseSnippet($"{a}+{b}*2"));控制台.ReadKey();}publicstaticobjectFN_ParseSnippet(stringsnippet){objectret=null;varusingList=newList();usingList.Add("系统");usingList.Add("System.Collections.Generic");usingList.Add("System.Text");usingList.Add("Microsoft.CSharp");//创建方法CodeMemberMethodpMethod=newCodeMemberMethod();pMethod.Name="执行";pMethod.Attributes=MemberAttributes.Public;pMethod.ReturnType=newCodeTypeReference(typeof(object));pMethod.Statements.Add(newCodeSnippetExpression("return"+snippet));//创建类CodeTypeDeclarationpClass=newSystem.CodeDom.CodeTypeDeclaration("Compilator");pClass.Attributes=MemberAttributes.Public;pClass.Members.Add(pMethod);//创建命名空间CodeNamespacepNamespace=newCodeNamespace("我的命名空间");pNamespace.Types.Add(pClass);foreach(stringsUsinginusingList)pNamespace.Imports.Add(newCodeNamespaceImport(sUsing));//创建编译单元CodeCompileUnitpUnit=newCodeCompileUnit();pUnit.Namespaces.Add(pNamespace);编译器参数param=new编译器参数();param.GenerateInMemory=true;列出pReferencedAssemblys=newList();pReferencedAssemblys=Assembly.GetExecutingAssembly().GetReferencedAssemblies().ToList();pReferencedAssemblys.Add(Assembly.GetExecutingAssembly().GetName());pReferencedAssemblys.Add(Assembly.GetCallingAssembly().GetName());foreach(AssemblyNameasmNameinpReferencedAssemblys){Assemblyasm=Assembly.Load(asmName);param.ReferencedAssemblies.Add(asm.Location);}//编译CompilerResultspResults=(newCSharpCodeProvider()).CreateCompiler().CompileAssemblyFromDom(param,pUnit);if(pResults.Errors!=null&&pResults.Errors.Count>0){//foreach(CompilerErrorpResults.Errors中的pError)//MessageBox.Show(pError.ToString());}varinstance=pResults.CompiledAssembly.CreateInstance("MyNamespace.Compilator");ret=instance.GetType().InvokeMember("执行",BindingFlags.InvokeMethod,null,instance,null);返还;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢