(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]