![]() |
1
8
很久以前,当我使用一个简单的图形应用程序时, this algorithm (对于这些简单的数学表达式来说,这是相当容易理解的,并且非常有用)首先将表达式转换为 RPN 然后计算结果。对于不同的变量值,RPN执行起来既好又快。 当然,语言解析是一个非常广泛的主题,有许多其他的方法来处理它(以及为它准备的工具)。 |
![]() |
2
4
@冉冉升起的明星 [我希望将此添加为注释,但格式设置失败] 这似乎有违直觉,但二叉树既简单又灵活。在本例中,节点可以是常量(数字)或运算符。当您决定使用诸如控制流和函数之类的元素来扩展语言时,二叉树会使您的生活变得更加容易。 例子:
在上述情况下,扫描器已被编程为将“-”后跟一系列数字作为单个数字,因此“-7”作为“数字”标记的值组件返回。-“后接空格”作为“减号”标记重新定义。这使得解析器更容易编写。它在需要“—(x*y)”的情况下失败,但您可以轻松地将表达式更改为“0-exp” |
![]() |
3
3
下面是一个简单的(简单的运算符优先顺序)语法。
当您处理“factor”时,您只需检查下一个标记是数字还是“(”,如果它是“(”,则再次分析“expression”,当 表达 返回检查下一个标记是否为”)。您可以通过使用 外面的 或 裁判 参数,或构建表达式树。 在ebnf中有同样的事情:
|
![]() |
4
2
你在学校上过正规语言课吗?实际上,您需要语法来进行分析。 编辑:哦,废话,维基百科说我错了,但现在我忘记了正确的名字:( http://en.wikipedia.org/wiki/Formal_grammar |
![]() |
5
2
去年我写了一个基本的数学评估,原因是我记不清了。它在任何方面都不是一个“合适的”解析器,而且..就像所有的旧代码一样,我现在并不为此感到骄傲。 但是 you can take a look 看看它是否对你有帮助。 您通过启动这个来运行一些输入测试 standalone Java app |
![]() |
6
2
当我想分析一些东西时,我决定使用黄金解析器:
解析器包括 sample grammars 包括一个用于操作人员。 除了黄金之外,还有其他更著名的解析器,例如 ANTLR 我还没用过。 |
![]() |
8
2
正如许多答案已经说明的那样,问题是你需要
您的解析器需要知道:
正如您所能想象的,编写(好的)解析器是一门艺术。好的是有几个工具
最后,如果你这样做是为了学习经验,那就继续吧。如果这是用于生产代码,不要重新设计轮子,并找到一个现有的库,否则您可能会花费1000行代码来添加2+2。 |
![]() |
9
1
本质上,您是在问我们如何编写一个“解析器”。下面是关于解析器的另一个堆栈溢出问题: hand coding a parser |
![]() |
10
1
我做了一些和你描述的相似的事情。我使用递归来解析所有的括号。然后我使用三元树来表示不同的部分。左侧分支是操作员的左侧。中心分部是接线员。右分支是操作员的右侧。 简短回答 递归树和三元树。 |
![]() |
11
1
始终可以选择使用数学分析器库,例如 mXparser . 你可以: 1-检查表达式语法
结果:
[MXParser-V.4.0.0] 2-评估表达式
结果:
3-使用内置函数常量、运算符等。
结果:
4-定义自己的函数、参数和常量
结果:
5-标记表达式字符串并使用表达式标记进行播放
结果:
6-你可以在 mXparser tutorial , mXparser math collection 和 mXparser API definition . 7-MXParser支持:
最好的问候 |