UVA342 HTML语法检查
题目描述
本题要求你编写一个程序,对使用 HTML(超文本标记语言,World Wide Web 上所有文档的编写语言)编写的简单文本进行语法验证。我们不考虑这些文档的语义或含义,只考虑简化的语法规则。在这些文档中,你会发现普通文本(具有任意行长度)与标记标签交织在一起。我们考虑的标记标签总是成对出现。下面的例子将说明这一点:
```
This is some ordinary text. Here's some additional
text. This will be boldface. Still more
```
示例中有两对标记标签。`ATAG` 和 `BOLD` 的含义在本题中并不重要,但通常标记标签会要求对其所应用的文本进行特定处理。标记标签很容易识别,因为它们总是出现在尖括号中(即小于符号和大于符号)。我们考虑的标签总是由不超过 $10$ 个大写字母字符组成的序列。标签影响的文档区域的结束由一个前面带有正斜杠 `/` 的同名标签表示。如图所示,被标记的区域可能跨越多行文本。同样如示例所示,HTML 标签必须正确嵌套,就像 Pascal 中的 `BEGIN...END` 对,或 C/C++ 中的 `{` 和 `}` 一样。
输入格式
输入将包含若干组测试用例。每组测试用例以单独一行开始,包含一个整数,指定该测试用例中的文本行数 $NL$。$NL$ 永远不会超过 $32767$。输入的结束由 $NL$ 的值为 $0$ 标记。
在每个测试用例中指定 $NL$ 的行之后,将有 $NL$ 行文本需要检查语法一致性。请记住,没有最大行长度限制。
输出格式
对于每个测试用例,输出测试用例编号(从 $1$ 开始顺序编号)。如果文本符合上述规则,则输出单词 `OK`。如果文本有错误,则仅针对第一个错误输出以下消息之一:
```
line #: bad character in tag name
line #: too many/few characters in tag name
line #: expected
line #: no matching begin tag.
```
这些消息中的 `#` 将被替换为检测到有问题的标签时的测试用例行号。这些消息何时显示的示例可以在紧随其后的示例输入和预期输出中找到。
如果检测到错误,在产生相应的错误消息后,你的程序必须跳过错误测试用例中的所有剩余行,以到达下一个测试用例的开头。
说明/提示
由 Claude 4.5 Sonnet 翻译。