www.msharpmath.com / 14 seoul national university 1 컴퓨터 개론 및 실습 강의 11 (parser)

14
www.msharpmath.com / 14 Seoul National University 1 컴컴컴 컴컴 컴 컴컴 컴컴 11 (parser)

Upload: melvin-barber

Post on 18-Jan-2016

227 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 1

컴퓨터 개론 및 실습

강의 11 (parser)

Page 2: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 2

■ 컴파일러의 기초

start list eoflist expr ; list | eexpr term moreterms moreterms + term { print(‘+’) } moreterms 3 + 4 * 5 = 3 + ( 4 * 5 ) | - term { print(‘-’) } moreterms | eterm factor morefactorsmorefactors * factor { print(‘*’) } morefactors | / factor { print(‘*’) } morefactors | div factor { print(‘DIV’) } morefactors | mod factor { print(‘MOD’) } morefactors | efactor (expr) | id { print(id.lexeme) } X = 3 ; 5 + X ; | num { print(num.value) }

parser

Page 3: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 3

+-*/DIVMOD ( )ID - 식별자NUM - 숫자DONE - 파일의 끝

token

Page 4: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 4

2 + 3 * 5 ;

12 div 5 mod 2 ;

-3 ; // homework

sample run

Page 5: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 5

#include <stdio.h> #include <string.h> #include <ctype.h>

#define STRMAX 999#define SYMMAX 100

#define BSIZE 128#define NONE -1#define EOS '\0'

#define NUM 256#define DIV 257#define MOD 258#define ID 259#define DONE 260

int lookahead = 0; int tokenval = NONE; int lineno = 1;

int lastchar = -1;int lastentry = 0;

parser program list

Page 6: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 6

char lexbuf[BSIZE]; char lexemes[STRMAX];

struct entry {char *lexptr;int token;}; struct entry symtable[SYMMAX];

struct entry keywords[] = {"div", DIV,"mod", MOD,0, 0};

parser program list

Page 7: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 7

int lookup(char s[]);int insert(char s[], int tok);void init();void parse();void expr();void term();void factor();void match(int t); void emit(int t, int tval);int lexan();void error(char *);

void main(){ init(); parse(); //exit(0); }

void init(){ struct entry *p; for (p = keywords; p->token; p++) insert(p->lexptr, p->token);}

parser program list

Page 8: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 8

int lookup(char s[]) { int p; for (p = lastentry; p > 0; p = p - 1) if (strcmp(symtable[p].lexptr, s) == 0) return p; return 0;}

int insert(char s[], int tok) { int len; len = strlen(s); if (lastentry + 1 >= SYMMAX) error("symbol table full"); if (lastchar + len +1 >= STRMAX) error("lexemes array full"); lastentry = lastentry + 1; symtable[lastentry].token = tok; symtable[lastentry].lexptr = &lexemes[lastchar + 1]; lastchar = lastchar + len + 1; strcpy(symtable[lastentry].lexptr, s); return lastentry;}

parser program list

Page 9: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 9

start list eoflist expr ; list | e

void parse(){ lookahead = lexan(); while (lookahead != DONE){ expr(); match(';'); }}

void match(int t) { if (lookahead == t) lookahead = lexan(); else error("syntax error");}

parser program list

Page 10: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 10

expr term moreterms moreterms + term { print(‘+’) } moreterms 3 + 4 * 5 = 3 + ( 4 * 5 ) | - term { print(‘-’) } moreterms | e

void expr(){ int t; term(); while (1) switch (lookahead){ case '+': case'-': t = lookahead; match(lookahead); term(); emit(t, NONE); continue; default: return; }}

parser program list

Page 11: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 11

term factor morefactorsmorefactors * factor { print(‘*’) } morefactors | / factor { print(‘*’) } morefactors | div factor { print(‘DIV’) } morefactors | mod factor { print(‘MOD’) } morefactors | e

void term(){ int t; factor(); while (1) switch (lookahead){ case '*': case '/': case DIV: case MOD: t = lookahead; match(lookahead); factor(); emit(t, NONE); continue; default: return; }}

parser program list

Page 12: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 12

factor (expr) | id { print(id.lexeme) } X = 3 ; 5 + X ; | num { print(num.value) }

void factor(){ switch (lookahead){ case '(': match('('); expr(); match(')'); break; case NUM: emit(NUM, tokenval); match(NUM); break; case ID: emit(ID, tokenval); match(ID); break; default: error("syntax error"); }}

parser program list

Page 13: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 13

void emit(int t, int tval) { switch (t) { case '+': case '-': case '*': case '/': printf("%c\n", t); break; case DIV: printf("DIV\n"); break; case MOD: printf("MOD\n"); break; case NUM: printf("%d\n", tval); break; case ID: printf("%s\n", symtable[tval].lexptr); break; default: printf("token %d, tokenval %d\n", t, tval); }}

void error(char *m) { //fprintf(stderr, "line %d: %s\n", lineno, m); printf("line %d: %s\n", lineno, m); //exit(1);}

parser program list

Page 14: Www.msharpmath.com / 14 Seoul National University 1 컴퓨터 개론 및 실습 강의 11 (parser)

www.msharpmath.com / 14Seoul National University 14

int lexan(){ int t; while (1){ t = getchar(); if (t == ' ' || t == '\t') ; else if (t == '\n') lineno = lineno + 1; else if (isdigit(t)) { ungetc(t, stdin); scanf("%d", &tokenval); return NUM; } else if (isalpha(t)){ int p, b = 0; while (isalnum(t)) { lexbuf[b] = t; t = getchar(); b = b + 1; if (b >= BSIZE) error("compiler error"); }

parser program list

lexbuf[b] = EOS;

if (t != EOF) ungetc(t, stdin); p = lookup(lexbuf); if (p == 0) p = insert(lexbuf, ID); tokenval = p; return symtable[p].token; } else if (t == EOF) return DONE; else { tokenval = NONE; return t; }}

}