2016q3 Homework5 (rubi)

contributed by
<shouchengH>, <greenyo0413>

Rubi

init();						//初始化
lex(source);					//詞彙解析
int (*jit_main)(int*, void**) = parser();	//語法剖析
jit_main(0, funcTable);
dispose();					//釋放記憶體

lex

將XXX.rb的程式碼做解析,存入tok.tok裡面

  1. isdigit -> 數字
  2. isalpha -> 識別字
  3. 空白或tab
  4. 註解 -> #內容
  5. 字串 -> "內容"
  6. 空行
  7. 運算元
  8. 分號(在程式碼行結束後,lex自行新增,為了轉換C語言)
typedef struct { char val[32]; int nline; } Token;	//nline -> 程式碼第幾行,
struct {
    Token *tok;						//預備存入所有1~8的起始位置
    int size, pos;					//size -> 程式碼1~8的總個數,pos -> 1~8個字的id
} tok;

parser

在expression函式中,開始解析識別字,將其分成函式名稱、全域變數、區域變數、型態、關鍵字

typedef struct {			//變數的宣告型態
    char name[32];			//名稱
    unsigned int id;			//id ,變數名稱不會重複 
    int type;				//int、double、string
    int loctype;			//global、local
} Variable;
typedef struct {			//函數宣告型態
    int address, args, espBgn;
    char name[0xFF];			//名稱
} func_t;
  • assignment :
    a = b

Rubi concurrency / parallelism

Reference

Select a repo