首选语言:C/C++,Java和Ruby.
我正在寻找一些有用的书籍/教程,如何编写自己的编译器只是为了教育目的.我最熟悉C/C++,Java和Ruby,所以我更喜欢涉及这三者之一的资源,但任何好的资源都是可以接受的.
这是挑战(我自己的发明,但如果以前出现在网络的其他地方,我不会感到惊讶).
编写一个函数,该函数采用单个参数,该参数是简单数学表达式的字符串表示形式,并将其作为浮点值进行计算."简单表达"可以包括以下任何一种:正十进制数或负十进制数,+,-,*,/,(,).表达式使用(正常)中缀表示法.操作员应按其出现的顺序进行评估,即不像在BODMAS中那样进行 评估,但当然应该正确观察括号.该函数应该为此表单的任何可能表达式返回正确的结果.但是,该函数不必处理格式错误的表达式(即语法错误的表达式).
表达的例子:
Run Code Online (Sandbox Code Playgroud)1 + 3 / -8 = -0.5 (No BODMAS) 2*3*4*5+99 = 219 4 * (9 - 4) / (2 * 6 - 2) + 8 = 10 1 + ((123 * 3 - 69) / 100) = 4 2.45/8.5*9.27+(5*0.0023) = 2.68...
我预计会有某种形式的"作弊"/狡猾,所以请让我预先反对它!通过作弊,我指的是eval在动态语言(如JavaScript或PHP)中使用或等效函数,或者同时编译和执行代码.(我认为我的"没有BODMAS"的规格几乎可以保证这一点.)除此之外,没有任何限制.我在这里预计会有一些Regex解决方案,但不仅仅是这样,我们会感到很高兴.
现在,我主要对C#/ .NET解决方案感兴趣,但是任何其他语言都是完全可以接受的(特别是F#和Python用于功能/混合方法).我还没有决定我是否会接受最短或最巧妙的解决方案(至少对于语言而言)作为答案,但我欢迎任何语言的任何形式的解决方案,除了我刚才禁止的!
我现在在这里发布了我的C#解决方案(403个字符).更新: …
假设我有一个标准的Python字符串(例如从中获取的字符串raw_input()),可能"2 + 2"是为了简单起见.
我想将这个字符串转换为Python中的标准数学运算,这样"2 + 2"就会返回4.
有没有一种简单的方法可以做到这一点,或者我是否必须拆分空格并手动解析每个数字/符号,然后根据我发现的数据进行数学运算?
我想要正则表达式吗?
我挑战你写一个数学表达式评估器,它尊重PEMDAS(操作顺序:括号,取幂,乘法,除法,加法,减法)而不使用正则表达式,一个预先存在的"Eval()" - 类似函数,一个解析库等
我在SO(这里)看到了一个预先存在的评估者挑战,但那个特别需要从左到右的评估.
样本输入和输出:
"-1^(-3*4/-6)" -> "1"
"-2^(2^(4-1))" -> "256"
"2*6/4^2*4/3" -> "1"
Run Code Online (Sandbox Code Playgroud)
我在C#中编写了一个评估器,但是我想看看它与那些选择语言的智能程序员相比有多糟糕.
澄清:
让我们使这个函数接受一个字符串参数并返回一个字符串结果.
至于为什么没有正则表达式,那就是平衡竞争环境.我认为"最紧凑的正则表达式"应该有一个单独的挑战.
使用StrToFloat()是可以接受的.通过"解析库",我的意思是排除诸如通用语法解析器之类的东西,也用于平衡游戏场.
支持浮动.
支持paretheses,取幂和四个算术运算符.
赋予乘法和除法优先权.
赋予加法和减法相同的优先权.
为简单起见,您可以假设所有输入都是格式良好的.
我不喜欢你的函数是否接受".1"或"1e3"之类的东西作为有效数字,但是接受它们会获得布朗尼积分.;)
对于除零情况,您可能会返回"NaN"(假设您希望实现错误处理).
如果我有一个字符串
'x+13.5*10x-4e1'
Run Code Online (Sandbox Code Playgroud)
如何将其拆分为以下令牌列表?
['x', '+', '13', '.', '5', '*', '10', 'x', '-', '4', 'e', '1']
Run Code Online (Sandbox Code Playgroud)
目前我正在使用shlex模块:
str = 'x+13.5*10x-4e1'
lexer = shlex.shlex(str)
tokenList = []
for token in lexer:
tokenList.append(str(token))
return tokenList
Run Code Online (Sandbox Code Playgroud)
但这回归:
['x', '+', '13', '.', '5', '*', '10x', '-', '4e1']
Run Code Online (Sandbox Code Playgroud)
所以我试图从数字中分割字母.我正在考虑使用包含字母和数字的字符串然后以某种方式拆分它们,但不确定如何执行此操作或如何将它们全部添加回列表中以及之后的其他字符串.令牌保持有序是很重要的,我不能拥有嵌套列表.
在理想的世界中,e和E不会以相同的方式被识别为字母,因此
'-4e1'
Run Code Online (Sandbox Code Playgroud)
会成为
['-', '4e1']
Run Code Online (Sandbox Code Playgroud)
但
'-4x1'
Run Code Online (Sandbox Code Playgroud)
会成为
['-', '4', 'x', '1']
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
使用Python,我将如何阅读(来自字符串,文件或url)数学表达式(1 + 1是一个好的开始)并执行它?
除了抓取一个字符串,文件或网址,我不知道从哪里开始.
我正在用Python创建一种编程语言,而我基本语言中缺少的一个主要组件就是能够解析数学方程式.我有解析数学的函数,但我需要能够检查输入是否是数学方程式.我正在寻找匹配3*x ^(4*y)+ 1-(7*y*z/x)之类的正则表达式.