#P1421. Peter's Calculator

    ID: 422 传统题 1000ms 256MiB 尝试: 2 已通过: 1 难度: 10 上传者: 标签>模拟Southwestern European Regional Contest 1995

Peter's Calculator

描述

不幸的是,彼得的计算器上周坏了。现在彼得只剩下他的电脑(没有计算器应用程序)和纸笔(这对工程师来说太累了)。作为彼得的朋友之一,你被要求为他编写一个计算器应用程序。经过与他交流,你了解到以下需求:

  1. 彼得只进行整数运算。他需要的操作包括加法、减法和乘法。
  2. 他希望使用任意数量的变量,变量名不超过50个字符。
  3. 他主要的计算方式是输入一些公式并将它们赋值给变量。有些公式是复杂的表达式,可能引用尚未定义的变量,而其他公式可能只是一个数字。然后,彼得会询问某些变量的值,即对这些公式求值。
  4. 彼得希望重新定义某些变量,然后重新计算依赖这些变量的公式。

输入严格遵循以下语法(以EBNF形式给出):

file = line { line } .

line = [ assignment | print | reset ] .

assignment = var ":=" expression.

print = "PRINT" var.

reset = "RESET".

expression = term { addop term }.

term = factor { mulop factor }.

factor = "(" expression ")" | var | number.

addop = "+" | "-".

mulop = "*".

在扩展巴科斯-诺尔范式(EBNF)中,A=B CA = B\ C 声明语法结构 AA 由一个 BB 后面跟着一个 CC 组成。A=B  CA = B\ |\ C 表示 AA 由一个 BB 组成,或者,作为另一种选择,由一个 CC 组成。A=[ B ]A = [\ B\ ] 将结构 AA 定义为要么是一个 BB,要么什么都没有,而 A={ B }A = \{ \ B\ \} 表示 AA 由任意数量(包括零个)的 BB 连接而成。

产生式 var 表示变量名,它以一个字母开头,后面最多跟 49 个字母或数字。字母可以是大写或小写。产生式 number 表示一个整数。这些产生式的确切语法如下所示。对于变量和语句来说,字母的大小写都很重要。 var = letter { letter | digit }.

number = [ "-" ] digit { digit }.

letter = "A" | "B" | ... | "Z" | "a" | "b" | ... | "z".

digit = "0" | "1" | ... | "8" | "9".

在语法结构的各部分之间(但不包括变量名或整数内部),可以出现任意数量的空格。<EOF>表示输入文件结束,<EOL>表示换行符。输入文件中的所有行均少于200个字符。

变量的值在以下情况下被视为未定义:

  1. 尚未定义,或引用了未定义的变量;
  2. 变量的定义中包含循环引用。

你的任务是编写一个程序,实现彼得的计算器。它应存储所有变量定义,并根据最新的变量定义对每个“PRINT”语句求值。如果程序遇到“RESET”语句,则应删除所有存储的变量,使所有变量变为未定义。

输入

输入包含符合上述语法的计算内容。每行可能是一个变量赋值、一个“PRINT”语句、一个“RESET”语句,或者为空。

输出

对于每个“PRINT”语句,程序应输出一行,包含指定变量的数值;如果变量未定义,则输出“UNDEF”。

输入数据 1

a := b + c  
b := 3  
c := 5  
PRINT d  
PRINT a  
b := 8  
PRINT a  
RESET  
PRINT a  

输出数据 1

UNDEF  
8  
13  
UNDEF  

来源

1995年西南欧区域赛