Parsing 解析儿童的基本数学方程式';什么是教育软件?

Parsing 解析儿童的基本数学方程式';什么是教育软件?,parsing,math,Parsing,Math,受a的启发,我想写一个小的教育软件。研究人员创造了一种称为“块”形状的小型计算机 (来源:) [David Merril,发明家-背景中有表格。] 他在许多应用程序中使用了块,但我最喜欢的是当每个块都是数字或基本运算符号时。然后,您可以在一行中重新排列数字块或操作符号,它将在另一个可筛选块上显示答案 所以,我决定在有限的范围内实现“Math Siftables”的软件版本,作为我正在学习的CS课程的最终项目 解析和解释数学表达式字符串的普遍接受的方法是什么,如果它们有效,则执行该操作? 在

受a的启发,我想写一个小的教育软件。研究人员创造了一种称为“块”形状的小型计算机


(来源:)
[David Merril,发明家-背景中有表格。
]

他在许多应用程序中使用了块,但我最喜欢的是当每个块都是数字或基本运算符号时。然后,您可以在一行中重新排列数字块或操作符号,它将在另一个可筛选块上显示答案

所以,我决定在有限的范围内实现“Math Siftables”的软件版本,作为我正在学习的CS课程的最终项目

解析和解释数学表达式字符串的普遍接受的方法是什么,如果它们有效,则执行该操作?

在这种情况下,我应该实现一个完整的解析器/词法分析器吗?我想解释基本的数学表达式是计算机科学中一个半常见的问题,所以我正在寻找正确的方法来解决这个问题

例如,如果我的数学筛选表按如下方式排列:

[1
]
[+
]
[2
]

这将是一个有效的序列,我将执行必要的操作以达到“3”

但是,如果子对象要将多个操作块拖到一起,例如:

[2
]
[\
]
[\
]
[5
]

这显然是无效的

最终,我希望能够使用用户可以拖动到一起的块来解析和解释任意数量的操作链。有人能给我解释一下或者给我指一下解析基本数学表达式的资源吗

我想要尽可能多的语言不可知论的答案。

你可以看看。链接的wikipedia页面有大量的信息和指向各种算法示例的链接

基本上,给定一个中缀数学表示法的表达式,它会返回AST或反向波兰语表示法,不管您的偏好是什么


这很好。在许多现代语言中,都有计算算术字符串表达式的方法。例如在Python中

>>> a = '1+3*3'     
>>> eval(a)         
10    
您可以使用异常处理来捕获无效语法


或者,您可以构建算术表达式树,在

中有一些这样的示例,如上所述,我将把普通字符串(中缀表示法)转换为后期修复表达式

然后,给定post-fix表达式,很容易解析和计算表达式。例如,将操作数添加到堆栈中,当您找到运算符时,将值从堆栈中弹出,并将其应用于操作数。如果将其转换为修复后表达式的代码是正确的,则不必担心操作顺序或类似的问题


本例中的大部分工作可能在转换过程中完成。您可以将转换后的表单存储在列表或数组中,以便于访问,这样就不需要再次解析每个值

您说一行中有几个运算符无效。但想想:

5 + -2
这是完全正确的

最基本的表达式语法如下:

Expression = Term | Expression, AddOp, Term
Term       = Factor | Term, MulOp, Factor
Factor     = Number | SignOp, Factor | '(', Expression, ')'

AddOp      = '+' | '-'
MulOp      = '*' | '/'
SignOp     = '+' | '-'

Number     = Digit | Number, Digit
Digit      = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

我曾经编写过一个简单的轻量级表达式解析器/计算器(字符串输入输出),它可以处理变量和函数。代码是用Delphi编写的,但翻译起来应该不会那么难。如果您感兴趣,我可以将源代码放到网上。

另一个注意事项是,有许多解析库可供用户用来完成此任务。从头开始编写一个好的表达式解析器并非易事,因此我建议您查看一个库


我为专门研究数学组件的奇异系统工作。我们提供两个数学解析器Jep Java,这可能会帮助您解决问题。祝你好运

对于这些受众,您可能希望提供与程序员不同的错误反馈,程序员习惯于“语法错误:位置foo处出现意外的“/”。我尝试在这里为教育小程序做一些更好的东西:


主要思想:用不同寻常的篇幅找到最小的可编辑性(因为输入表达式不长,所以很实用),并生成一个较长的简明英语解释,说明解析器所坚持的内容。

我觉得不仅问题本身,而且项目的目的都是值得称赞的。希望答案会很有启发性。我们不把第二个例子理解为2除以负5吗?还是负数超出了这个练习的数学水平?@Rex M,没错,也许这是个坏例子。也许两个除法符号会更好。@Rex M,或者对于一个有漂亮名字的漂亮算法,甚至可能以“3+5/+”+1这样的非终结符结尾。我曾经写过一个解析中缀的算法,这让我很痛苦。我想我应该检查一下那里是否已经有东西了(这又回到了Windows3.0时代)。