我正在使用Java制作计算器,并且正在使用1个下推自动机和1个确定性有限自动机来实现它。 这是应该如何执行的示例。它一次只运行一行。
> 3 5 +
8
> 2 8 *
16
> x = 3
3
> x 2 /
1.5
我拥有的DFA工作正常,它用于解析字符并将其分类为数字,变量,运算符,等于(赋值)。然后将其发送到PDA,在此完成实际计算。它不是PDA的一部分,只是它使用堆栈来存储准备使用的值。它还具有用于存储变量及其值的哈希图。
上面示例中的所有内容,我都可以使用我的代码开始工作。但是,我无法执行以下操作。
> x = 4 5 *
20
我的代码改为输出4。
这是我程序的伪代码,我希望有人可以帮助我了解如何更改它,以便我可以正确地进行分配。
Stack
Hashmap
while token != End of Line:
get next token
if token == variable:
if hashmap.contains(variable):
stack.push(hashmap.get(variable))
else:
hashmap.put(variable, 0.0) # default value
if token == number:
stack.push(number)
if token == {+ - * /}:
n1=stack.pop
n2=stack.pop
stack.push(n1 {+ - * /} n2)
if token == Equals:
# I am having trouble with this.
我在“等于”部分遇到麻烦。我想知道是否有一种有效的方法。我确实使它起作用,但是它很麻烦,因为您必须存储令牌的字符串,然后等待直到处理完整个行。似乎会有一种更简单的方法。我发现它很棘手,因为当它先读变量然后等于时,它不在堆栈上。您必须保留变量名,然后等待处理结束。