#P3524. Bug Hunt
Bug Hunt
题目描述
本题考虑一种简单的编程语言,该语言仅包含一维整数数组的声明和赋值语句。问题是找出给定程序中的错误。
该语言的语法用BNF定义如下:
‹program› ::= ‹declaration› | ‹program›‹declaration› | ‹program›‹assignment›
‹declaration› ::= ‹array_name›[‹number›]‹new_line›
‹assignment› ::= ‹array_name›[‹expression›]=‹expression›‹new_line›
‹expression› ::= ‹number› | ‹array_name›[‹expression›]
‹number› ::= ‹digit› | ‹digit_positive›‹digit_string›
‹digit_string› ::= ‹digit› | ‹digit›‹digit_string›
‹digit_positive› ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
‹digit› ::= 0 | ‹digit_positive›
‹array_name› ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
其中,‹new_line›表示换行符(LF)。
程序中使用的字符仅限于字母、十进制数字、=
、[
、]
和换行符,不会出现其他字符。
一个声明声明了一个数组并指定其长度。长度为$ n $的数组的有效索引是$ 0 $到$ n-1 $之间的整数(包含端点)。注意,数组名区分大小写,例如数组a
和数组A
是不同的数组。声明数组的每个元素的初始值未定义。
例如,长度为$ 10 $的数组a
和长度为$ 5 $的数组b
分别声明如下:
a[10]
b[5]
表达式的值是一个非负整数。‹number›被解释为十进制整数。‹array_name›[‹expression›]表示取该数组中由‹expression›计算出的索引对应的元素的值。赋值语句把右边表达式的值赋给左边指定的数组元素。
赋值语句的示例:
a[0]=3
a[1]=0
a[2]=a[a[1]]
a[a[0]]=a[1]
程序从第一行开始逐行执行。你可以假设每个数组只声明一次,并且声明在其任何元素被赋值或访问之前。
给定一个程序,你需要找出以下两类错误:
- 数组的索引无效(越界)。
- 在赋值语句中,访问了未被赋值的数组元素(无论是作为索引还是作为右值)。
你可以假设程序不会出现语法错误,也可以假设‹number›表示的整数在$ 0 $到$ 2^{31} - 1 = 2147483647 $范围内。
输入
输入包含多组数据集,每组数据集由一个程序组成,后面跟一行只包含一个.
(句点)结束。每个程序不超过$ 1000 $行。每行不超过$ 80 $个字符(不含换行符)。
输出
对每个程序,输出第一个出现错误的赋值语句的行号。每个程序的行号从$ 1 $开始计数。如果程序没有错误,则输出$ 0 $。输出中不应包含多余的空格等字符。
输入样例 1
a[3]
a[0]=a[1]
.
x[1]
x[0]=x[0]
.
a[0]
a[0]=1
.
b[2]
b[0]=2
b[1]=b[b[0]]
b[0]=b[1]
.
g[2]
G[10]
g[0]=0
g[1]=G[0]
.
a[2147483647]
a[0]=1
B[2]
B[a[0]]=2
a[B[a[0]]]=3
a[2147483646]=a[2]
.
.
输出样例 1
2
2
2
3
4
0
来源
Japan 2007