首次编辑:2024/6/21/17:46
最后编辑:2024/6/21/18:02
最近一直想写一个解释器。
在这个过程中我会参考其它的一些交互式解释器的做法,比如对于提示符,在python中,命令提示符为“>>> ”,lua中为“> ”。
一般情况下,输入完成之后按下回车,解释器就会开始解析输入的内容。
但也有例外,比如python和lua在定义函数时,写完了开头的“def f:”或“func fun()”之后,并不会立刻解析输入,而是会输出不一样的提示符(python中为“... ”,lua中为“>> ”),要求你继续输入函数的定义内容。
这两种提示符肯定是会保存在某个变量中的,比如python中,甚至可以直接修改掉这个变量的值:
import sys
sys.ps1 = "请输入内容: "
sys.ps2 = "请接着输入: "
lua简单一点,在lua源码中它用了宏来定义提示符,实际上就是字符串字面量了。
#define LUA_PROMPT "> "
#define LUA_PROMPT2 ">> "
但这样的命令行提示符的切换实现起来也挺麻烦的,还要根据解释器的状态来决定显示哪个提示符,于是我还是决定参考一下lua的实现。
没想到结果让我很出乎意料,原先我想的是,它们的处理方式应该是类似我在C语言实现交互式终端所写的那样,在每次fgets
之前输出一下提示符:
char buf[256];
printf(">> ");
while ( fgets(buf, sizeof(buf), stdin) != NULL){
// 在这里对读入的字符串进行处理
printf(">> ");
}
结果没想到lua是使用了lua api来实现的(可以简单理解为,lua来等待用户输入之前,自己用lua的print
打印了一次提示符)。