我使用简单的堆栈算法开发了一个方程解析器,它将处理二进制(+, - ,|,&,*,/等)运算符,一元(!)运算符和括号.
但是,使用这种方法会让我拥有相同优先级的所有内容 - 无论操作符如何,都会从左到右进行评估,尽管可以使用括号强制执行优先级.
所以现在"1 + 11*5"会返回60,而不是人们所期望的56.
虽然这适用于当前项目,但我希望有一个通用例程,我可以用于以后的项目.
编辑清晰:
解析具有优先级的方程的好算法是什么?
我对一些简单的实现感兴趣,并且理解我可以自己编写代码来避免使用可用代码的许可问题.
语法:
我不明白语法问题 - 我是手写的.这很简单,我认为不需要YACC或Bison.我只需要用诸如"2 + 3*(42/13)"之类的方程计算字符串.
语言:
我在C中这样做,但我对算法感兴趣,而不是语言特定的解决方案.C足够低,如果需要,很容易转换成另一种语言.
代码示例
我发布了上面讨论的简单表达式解析器的测试代码.项目要求发生了变化,因此我从不需要优化性能或空间代码,因为它没有包含在项目中.它是原始的详细形式,应该易于理解.如果我在运算符优先级方面做了更多的事情,我可能会选择宏hack,因为它简单地匹配程序的其余部分.但是,如果我在一个真实的项目中使用它,我将寻求一个更紧凑/更快速的解析器.
相关问题
-亚当
如果我有一个带有有效数学表达式的字符串,例如:
String s = "1 + 2 * 7";
Run Code Online (Sandbox Code Playgroud)
在.NET中是否有内置的库/函数来解析和评估该表达式并返回结果?在这种情况下15.
我需要评估一个在C#中作为字符串呈现给我的数学表达式.示例noddy但是得到了字符串作为表达式的点.
我需要求值然后填充一个int.
C#中没有Eval(),就像其他langugaes一样......
String myString = "3*4";
Run Code Online (Sandbox Code Playgroud)
编辑:
我在VS2008上
试过Microsoft.JScript.=已弃用的方法(但仍然符合 - 警告)
但是,我已经使用的Microsoft.JScript DLL工作了
public object InvokeMember(string name,BindingFlags invokeAttr,Binder binder,object target,object [] args);
抱怨缺少";" 去搞清楚...
编辑2
解决方案 - 是codeDom之一 - 因为没有安全问题,所以它工作 - 只有我才能运行代码.非常感谢回复......
和新龙书的链接真棒
编辑3
Matt dataTable.Compute()也有效 - 对于安全意识更好.(注明参数检查)
我正在尝试用C#构建一个计算器.现在我想知道是否可以进行文本字段内的计算.例如,用户进入文本字段(2*3)+6.现在我如何告诉我的脚本计算它然后输出结果?
有没有办法解析vb.net中的字符串(比如,内置方法),可以像Eval一样进行数学运算吗?例如,3 +(7/3.5)作为字符串将返回2.
我不是要求你为我编写代码,我只是想知道是否有内置的方法来执行此操作,如果没有,我将自己编写代码.
我可以打赌它不能自己解析像Sin(90)这样的东西,我明白需要用Math.Sin(90)代替它.
如果有内置方法,你如何使用它?
我正在寻找一个使用变量,自定义运算符和用户定义函数的.NET Math Parser ......从今天起我就使用了muParser(.NET有一个包装版本),但我注意到它太慢了!
有没有人知道另一个算法非常好的Math Parser(免费!)?
我试过NCalc,但它没有变量,所以它失败了..
给定一个包含数学表达式的字符串,给定一组函数/命令并给定一组赋值变量,.NET是否提供了快速构建解析器的工具?
我想构建一个简单的解析器来分析表达式并将其分解为最简单的组件,例如:
d*(abs(a-b)+sqrt(c))
变
f = abs(a-b) 和 g = sqrt(c)e = f + gd*e可能重复:
C# - 解析数学表达式
C#,用户定义的公式
该等式仅使用加法,减法,乘法,除法运算符,不会使用括号.我不认为这会如此困难,但我在尝试不同的事情和写出不同的想法时已经考虑了好几个小时.
我认为可能有某种方法可以通过在每个字符上分割字符串并使用输出执行某些操作,或者逐个字符地循环字符串并提出一些内容,但我猜想我并不聪明.
无论如何,我很想听到其他人的想法,因为我很难过.我不想使用某种类型的第三方库,这是每个人在我一直关注的旧线程中建议的.