(Jiandan) Mua (I) - Lexical Analyzer

题意翻译

Mini-Lua 是一个刘汝佳的实验语言,用于实现算法而非实际程序。 在这个问题中,你需要将一个 Mini-Lua 的程序分割为一个一个 token。 Mini-Lua 中有七种不同的 token。 1. 保留字`[RESERVED]`: - Mini-Lua 是区分大小写的,所以 `AND` 并不是一个有效的保留字。 - 保留字列表: - `and,break,do,else,elseif,end,false,for,function,if,in,local,nil,not,or,repeat,return,then,true,until,while`。 2. 数字`[NUMBER]`: - 整数: - 整数分为十进制整数和十六进制整数。 - 十进制整数由若干个数字组成。 - 十六进制整数有前缀 `0x` 或 `0X`,然后跟随若干个 `0..9` 或 `a..f` (不区分大小写,例如 `0x0aA` 也是一个有效的十六进制整数) - 实数 - 实数分为普通十进制实数和科学计数法十进制实数。 - 普通十进制实数,比如 `123.456` 就是一个有效的普通十进制实数,而 `5.3.3` 就不是。 - 普通十进制实数可以忽略整数,但是如果忽略整数,就必须要有一个小数点和小数点后至少一位数字。比如 `.3` 是合法的,`.` 就是不合法的。 - 科学计数法十进制实数,就是一个普通的十进制实数,在后面加上一个 `e`,再一个 `+` 或 `-` 或什么也没有,再一个十进制整数。 3. 字符串`[STRING]`: - 用 `""` 或 `''` 括起来的被称为字符串。只支持四种转义字符:`\\,\n,\',\"`。 - 转义字符下的引号应当被视为一个普通的字符而非引号,所以 `"\"'"` 是一个合法的字符串。 - `'"'` 是一个合法的字符串,`"'` 不是。 4. 符号`[SYMBOL]`: - 符号列表: - `+` `-` `*` `/` `%` `^` `#` `==` `>=` `<=` `>` `<` `~=` `(` `)` `{` `}` `[` `]` `;` `:` `,` `.` `..` `...` `=` 5. 名称`[NAME]`: - 由字母打头,后面跟着 字母、数字、下划线 的标识符。 - 保留字不能被称作名称。 6. 换行`[EOL]`: - 换行时请解析 `[EOL]`。 7. 注释`[COMMENT]`: - 以 `--` 开头,剩下的一整行都是注释。 - 注释不应当被你的程序解析。 - 这一行的 `[EOL]` 仍然应当被解析。 - `-- 这是一个注释 -- 这还是一个注释` 的解析结果应当是 `[EOL]`。 - 在字符串内,注释不应当被识别,比如 `"--这并不是一个注释"` 不是一个注释,这应当被解析为一个 `[STRING]` 和一个 `[EOL]`。 你的代码应当使用贪心算法,即,当前 token 应当取到不能取为止。

题目描述

[problemUrl]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=279&page=show_problem&problem=3852 [PDF](https://uva.onlinejudge.org/external/124/p12421.pdf) ![](https://cdn.luogu.com.cn/upload/vjudge_pic/UVA12421/adc0dabd19b78c5f47c67a4548f7617723d616dc.png)

输入输出格式

输入格式


![](https://cdn.luogu.com.cn/upload/vjudge_pic/UVA12421/546a3852d1b1e76d173bd9d29b113e7ed93e2eb2.png)

输出格式


![](https://cdn.luogu.com.cn/upload/vjudge_pic/UVA12421/71d7ce8723374cb0f0abfded096d726265226789.png)

输入输出样例

输入样例 #1

print("Hello".." ".."--\"World\"--")
x=-3+4
this_1s_a_variable = 0xabcF-.012e-56+7.e8+9e+10--8
if 1 then
y=x
end
print (y)

输出样例 #1

[NAME] print
[SYMBOL] (
[STRING] "Hello"
[SYMBOL] ..
[STRING] " "
[SYMBOL] ..
[STRING] "--\"World\"--"
[SYMBOL] )
[EOL]
[NAME] x
[SYMBOL] =
[SYMBOL] -
[NUMBER] 3
[SYMBOL] +
[NUMBER] 4
[EOL]
[NAME] this_1s_a_variable
[SYMBOL] =
[NUMBER] 0xabcF
[SYMBOL] -
[NUMBER] .012e-56
[SYMBOL] +
[NUMBER] 7.e8
[SYMBOL] +
[NUMBER] 9e+10
[EOL]
[RESERVED] if
[NUMBER] 1
[RESERVED] then
[EOL]
[NAME] y
[SYMBOL] =
[NAME] x
[EOL]
[RESERVED] end
[EOL]
[NAME] print
[SYMBOL] (
[NAME] y
[SYMBOL] )
[EOL]