Kaleidoscope 语言介绍

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;
}
comments powered by Disqus