Open ccckmit opened 2 years ago
#include <assert.h>
#include "compiler.h"
int E();
void STMT();
void IF();
void BLOCK();
int tempIdx = 0, labelIdx = 0;
#define nextTemp() (tempIdx++)
#define nextLabel() (labelIdx++)
#define emit printf
int isNext(char *set) { //...}
int isEnd() { //...}
char *next() { //...}
char *skip(char *set) { //...}
// F = (E) | Number | Id
int F() { //...}
// E = F (op E)*
int E() { //...}
// ASSIGN = id '=' E;
void ASSIGN() { //...}
// WHILE = while (E) STMT
void WHILE() { //...}
// DO WHILE
void DO(){
int DoBegin = nextLabel();
int DoEnd = nextLabel();
emit("(L%d)\n", DoBegin);
skip("do");
STMT(); // block call STMTS , } to end
skip("while");
skip("(");
int e = E();
emit("if not T%d goto L%d\n", e, DoEnd);
skip(")");
skip(";"); // 需要過濾掉,不然一開始在main() 執行的 STMTS會觸發 ASSIGN() 裡面的 skip("=") 導致錯誤
emit("goto L%d\n", DoBegin);
emit("(L%d)\n", DoEnd);
}
// STMT = WHILE | BLOCK | ASSIGN
void STMT() {
if (isNext("do")){
DO();
}
else if(isNext("while"))
WHILE();
// else if (isNext("if"))
// IF();
else if (isNext("{"))
BLOCK();
else
ASSIGN();
}
// STMTS = STMT*
void STMTS() {//...}
// BLOCK = { STMTS }
void BLOCK() { //...}
// PROG = STMTS
void PROG() { //...}
void parse() {
printf("============ parse =============\n");
tokenIdx = 0;
PROG();
}
執行結果
============ parse =============
t0 = 0
s = t0
t1 = 1
i = t1
(L0)
t2 = s
t3 = i
t4 = t2 + t3
s = t4
t5 = i
t6 = 1
t7 = t5 + t6
i = t7
t8 = i
t9 = 10
t10 = t8 < t9
if not T10 goto L1
goto L0
(L1)
110910511 蘇郁晴 https://github.com/yucing/sp110b/wiki/e1.md
110910518 黃紹安 https://github.com/shaoan901226/sp/wiki/HOMEWORK1
110910515 陳文吉 https://github.com/RyanChen-01/sp110b/wiki/hw1.md
110910501 王澤瑋 https://github.com/nakirifumiya/sp110b/wiki/hw1
110910506林庭光 https://github.com/Lin610313/sp110b/wiki/work1.md
110910507 王證傑 https://github.com/stayjay/sp110b/wiki/homework1
資工三 110810509 蘇乾羽 https://github.com/qweasd049564/sp110b/blob/master/hw/hw1.md
資工二 110911542 邵南翔 https://github.com/zraiz/sp110b/blob/master/Homework/01/Homework01.md
資工二 110910529 劉宸羽 https://github.com/yumao57/sp110b/wiki/%E7%BF%92%E9%A1%8C%E4%B8%80
資工二 110911543 何文旺 https://github.com/WForU/sp110b/wiki/HW1.md
資工二110910510吳昆儒 https://github.com/wukunru/sp110b/wiki/%E7%BF%92%E9%A1%8C1
https://github.com/Uriel58/sp110b/wiki/do...while 資工二 110910503 林成也
資工二 110910539 鄭智陽 https://github.com/OohelloworldoO/sp110b/wiki/exercise-1
110910504趙唯安 https://github.com/wei-annn/sp110b/wiki/hw1.md
參考:
範例