Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

習題 1 : 請為編譯器加上 do ... while 語法的程式碼 #8

Open
ccckmit opened this issue Mar 9, 2022 · 44 comments
Open

習題 1 : 請為編譯器加上 do ... while 語法的程式碼 #8

ccckmit opened this issue Mar 9, 2022 · 44 comments

Comments

@ccckmit
Copy link
Contributor

ccckmit commented Mar 9, 2022

參考:

  1. https://gitlab.com/ccc110/sp/-/tree/master/03-compiler/03a-compiler
  2. https://gitlab.com/ccc110/sp/-/tree/master/03-compiler/06-compiler-run
  3. https://github.com/ccc-c/rubi/
  4. https://github.com/ccc-c/c4/

範例

s=0;
i=1;
do {
  s = s + i;
  i = i + 1;
} while (i <= 10);
@z22756392z
Copy link

z22756392z commented Mar 9, 2022

@stereomp3
Copy link

stereomp3 commented Mar 9, 2022

dowhile

#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)

@zhengyucen
Copy link

110810548 鄭宇岑

@yucing
Copy link

yucing commented May 1, 2022

110910511 蘇郁晴
https://github.com/yucing/sp110b/wiki/e1.md

@Mocha777
Copy link

Mocha777 commented Jun 5, 2022

@shaoan901226
Copy link

110910518 黃紹安
https://github.com/shaoan901226/sp/wiki/HOMEWORK1

@RyanChen-01
Copy link

RyanChen-01 commented Jun 8, 2022

110910515 陳文吉
https://github.com/RyanChen-01/sp110b/wiki/hw1.md

@nakirifumiya
Copy link

110910501 王澤瑋
https://github.com/nakirifumiya/sp110b/wiki/hw1

@jifkavnb0205
Copy link

110810507 李安博

@Lin610313
Copy link

110910506林庭光
https://github.com/Lin610313/sp110b/wiki/work1.md

@Paouser
Copy link

Paouser commented Jun 11, 2022

110910522 劉煒辰

@stayjay
Copy link

stayjay commented Jun 12, 2022

110910507 王證傑
https://github.com/stayjay/sp110b/wiki/homework1

@qweasd049564
Copy link

資工三 110810509 蘇乾羽
https://github.com/qweasd049564/sp110b/blob/master/hw/hw1.md

@Sakura01210
Copy link

110910508 王冠文

@404HK416
Copy link

110810403 蘇彥華

@zraiz
Copy link

zraiz commented Jun 14, 2022

資工二 110911542 邵南翔
https://github.com/zraiz/sp110b/blob/master/Homework/01/Homework01.md

@yumao57
Copy link

yumao57 commented Jun 14, 2022

資工二 110910529 劉宸羽
https://github.com/yumao57/sp110b/wiki/%E7%BF%92%E9%A1%8C%E4%B8%80

@choco427
Copy link

@Roy-Roo
Copy link

Roy-Roo commented Jun 14, 2022

@kaifeng273
Copy link

@patrick901218
Copy link

@Kenttsai1
Copy link

110910509 蔡宗霖

@jiajianong
Copy link

@WForU
Copy link

WForU commented Jun 15, 2022

資工二 110911543 何文旺
https://github.com/WForU/sp110b/wiki/HW1.md

@qwezxca123
Copy link

@wukunru
Copy link

wukunru commented Jun 15, 2022

資工二110910510吳昆儒
https://github.com/wukunru/sp110b/wiki/%E7%BF%92%E9%A1%8C1

@Uriel58
Copy link

Uriel58 commented Jun 15, 2022

https://github.com/Uriel58/sp110b/wiki/do...while
資工二 110910503 林成也

@gakuplusq
Copy link

@Selesfia
Copy link

@weiian000
Copy link

@mozi5269
Copy link

mozi5269 commented Jun 16, 2022

@derek120432
Copy link

@QuiLinxinag
Copy link

@Soober9260
Copy link

@po-hsiang666
Copy link

@Vialbum
Copy link

Vialbum commented Jun 16, 2022

@OohelloworldoO
Copy link

OohelloworldoO commented Jun 17, 2022

資工二 110910539 鄭智陽
https://github.com/OohelloworldoO/sp110b/wiki/exercise-1

@al2698
Copy link

al2698 commented Jun 17, 2022

@ChiaYunn
Copy link

110810535

@YangTiChu
Copy link

資工二 110910527 楊堤筑 習題1

@nnnnnnn1266
Copy link

@wei-annn
Copy link

110910504趙唯安
https://github.com/wei-annn/sp110b/wiki/hw1.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests