我制作了一个Java解释器,用户可以在其中输入如下操作:
$x+23/$y+9*$z
$x , $y, $z
是先前定义的变量。
使用另一段代码,我将使用各自的值替换这些变量,然后我想将字符串重新组合在一起。
示例:
$x = 1
$y = 2
$z = 3
所以操作最终会是这样的:
1+23/2+9*3
如果用户可能执行不同长度和顺序的操作,我如何从主String中有效地提取这些变量并将它们重新装入?
答案 0 :(得分:2)
我认为你应该完全解析你的输入字符串,将它分成有意义的标记,而不应该依赖于例如搜索和替换强>点。
搜索和替换不考虑整个上下文,因此即使存在语法错误或多字符变量名称 - 它也会盲目地替换部分用户输入数据。例如。考虑到您的用户已经定义了一个名为' e'然后他用指数格式写一个数字,如:1e-2(0.01)。显然,' e'在数字中不应被视为上述变量' e'在这方面。
所以要使它有序:为自己定义你的令牌是什么。在我看来他们是:
定义标记后,定义语法。例如。在所谓的波兰记谱法写作" 2 3 +"是" 2 + 3" (波兰表示法很容易使用堆栈来评估表达式,它使您无需分析括号和操作员的不同优先级)。
然后解析用户输入以提取令牌并根据您的语法分析它们之间的关系。否则,您将收到很多针对您的程序无法正常运行的极端情况,包括您将无法分隔的用户拼写错误(在这种情况下,您应该提供语法错误'消息。