Kaleidoscope 基本语法 #
# Compute the x'th fibonacci number.
def fib(x)
if x < 3 then
1
else
fib(x-1)+fib(x-2)
# This expression will compute the 40th number.
fib(40)
并且支持调用标准库
extern sin(arg);
extern cos(arg);
extern atan2(arg1 arg2);
atan2(sin(.4), cos(42))
Lexer 词法分析 #
int CurTok;
std::string IdentifierStr;
double NumVal;
int gettok() {
static int LastChar = ' ';
// 忽略空白符,直到遇到非空白符
while (isspace(LastChar)) {
LastChar = getchar();
}
// 这里开始就是第一个非空 [a-zA-Z] 字符
if (isalpha(LastChar)) {
IdentifierStr = LastChar;
// 从第一个非空字符开始循环读取,直到遇到空白符
while (isalnum(LastChar = getchar())) {
IdentifierStr += LastChar;
}
// 如果是 def,返回 tok_def
if (IdentifierStr == "def") {
return tok_def;
}
// 如果是 extern,返回 tok_extern
if (IdentifierStr == "extern") {
return tok_extern;
}
// 如果是标识符,返回 tok_identifier
return tok_identifier;
}
// 这里开始就是第一个非空 [0-9|.] 字符
if (isdigit(LastChar) || LastChar == '.') {
std::string NumStr;
do {
NumStr += LastChar;
LastChar = getchar();
} while (isdigit(LastChar) || LastChar == '.');
// 将 String 转为 Double 数据类型
// 返回 tok_number
NumVal = strtod(NumStr.c_str(), 0);
return tok_number;
}
// 如果是 #,直接忽略一整行
if (LastChar == '#') {
do {
LastChar = getchar();
} while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
if (LastChar != EOF) {
return gettok();
}
}
// 结束符
if (LastChar == EOF) {
return tok_eof;
}
int ThisChar = LastChar;
LastChar = getchar();
return ThisChar;
}