CFG exp op exp exp number op exp
예제: CFG exp op exp | ( exp ) | number op + | - | * exp (“+”|“-”|“*”) exp | “(” exp “)” | number exp op exp ( exp ) exp number op + op * E E O E | ( E ) | n O + | - | * 5
Example: CFG exp op exp | ( exp ) | number op + | - | * Recursive 규칙 “Base” 규칙 – CFG가 정규식과 어떻게 다른가? digit = 0|1|…|9 number = digit* 8
파싱 알고리즘 • Top down – Recursive descent – “Predictive” table-driven, “LL” • Bottom up – “LR”, “LALR” 10
예제: 유도 • 다음 문자열에 대한 유도는? [“(34 -3)*42”] exp → exp op exp | ( exp ) | number Op → + | - | * (1) exp op exp (2) exp op number (3) exp * number (4) ( exp ) * number (5) ( exp op exp ) * number (6) (exp op number) * number (7) (exp - number) * number (8) (number - number)*number [exp op exp] [exp number] [op * ] [exp ( exp )] [exp op exp] [exp number ] [op - ] [exp number ] 12
문법 규칙 • 좌순환 규칙(Left recursive rule) A→Aα|β • Ex. A Aa|a A Aa | • 우순환 규칙(Right recursive rule) A→αA|β • Ex. A a. A|a A a. A| • ε-production A→ε 16
More Examples • G: A ( A ) A | L(G) = ? 17
More Examples • G : statement if-stmt | other if-stmt if ( exp ) statement else-part else statement | exp 0 | 1 L(G) = ? 18
More Examples • G: stmt-sequence stmt ; stmt-sequence | stmt s – L(G) = ? 19
More Examples • G: stmt-sequence stmt ; stmt-sequence | stmt s L(G) = ? 20
More Examples • G: stmt-sequence nonempty-stmt-sequence | nonempty-stmt-sequence stmt ; nonempty-stmt-sequence | stmt s L(G) = ? 21
예제: 유도 • 최좌단 유도: (1) exp op exp (2) (exp) op exp (3) (exp op exp) op exp (4) (number op exp) op exp (5) (number - exp) op exp (6) (number - number) op exp (7) (number - number) * exp (8) (number - number) * number • 최우단 유도는? exp → exp op exp | ( exp ) | number Op → + | - | * [exp op exp] [exp ( exp )] [exp op exp] [exp number] [op -] [exp number] [op *] [exp number] 24
유도와 파스트리 • 최좌단 유도 (1) exp (2) (3) (4) exp → exp op exp | ( exp ) | number Op → + | - | * exp op exp number + number (1) • 상응 파스 트리 preorder numbering (2) exp number exp (3) op + (4) exp number 25
유도와 파스 트리 l exp → exp op exp | ( exp ) | number Op → + | - | * 최 우단유도 (1) exp (2) (3) (4) exp op number exp + number • 상응 파스 트리 the reverse of postorder numbering (1) (4) exp number exp (3) op + (2) exp number 26
예제: AST Parse tree AST exp + exp op exp 3 number (3) + 4 number (4) 31
예제: AST Parse tree AST exp * exp op exp - ( exp ) * 42 number (42) exp op exp number - number (34) (3) 34 3 32
a formal Abstract syntax definition using a BNF-like notation AST Structure Abstract syntax definition exp Op. Exp(op, exp) | Const. Exp(integer) op Plus | Minus | Times Abstract syntax data type declaration exp → exp op exp | ( exp ) | number Op → + | - | * actual syntax tree structure used by the parser typedef enum {Plus, Minus, Times} Op. Kind; typedef enum {Op. K, Const. K} Exp. Kind; typedef struct streenode { Exp. Kind kind; Op. Kind op; // 연산자 유형 struct streenode *lchild, *rchild; int val; // 상수 값 op & val은 exclusive } STree. Node; or => 더 효율적 표현 33 은? typedef STree. Node *Syntax. Tree;
AST Structure (using a union) typedef enum {Plus, Minus, Times} Op. Kind; typedef enum {Op. K, Const. K} Exp. Kind; typedef struct streenode { Exp. Kind kind; struct streenode *lchild, *rchild; union { Op. Kind op; int val; } attribute; } STree. Node; typedef STree. Node *Syntax. Tree; 34
예제: AST • 다음 문법 G에 대해서 statement → if-stmt | other If-stmt → if (exp) statement else-part → else statement | ε exp → 0 | 1 – 다음 문자열에 대한 파스 트리와 추상구문 트리는? “if (0) other else other” 35
예제: AST • 다음 문법 G에 대해서 statement → if-stmt | other If-stmt → if (exp) statement else-part → else statement | ε exp → 0 | 1 – 다음 문자열에 대한 파스 트리와 추상구문 트리는? “if (0) other else other” If 0 other 추상 구문 트리 other 36
AST Structure • Abstract syntax data type declaration statement → if-stmt | other If-stmt → if (exp) statement else-part → else statement | ε exp → 0 | 1 typedef enum {Exp. K, stmt. K} Node. Kind; typedef enum {Zero, One} Exp. Kind; typedef eunum {If. K, Other. K} Stmt. Kind; typedef struct streenode { Node. Kind kind; Exp. Kind ekind; Stmt. Kind skind; struct streenode *test, *thenpart, *elsepart; } STree. Node; typedef STree. Node *Syntax. Tree; 37
예제: AST • G: stmt-sequence stmt ; stmt-sequence | stmt s – “s; s; s”에 대한 파스 트리와 AST는? 38
예제: AST • G: stmt-sequence stmt ; stmt-sequence | stmt s – “s; s; s”에 대한 파스 트리와 AST는? seq ; ; s s s 39
문법 모호성: Dangling Else statement if-stmt | other if-stmt if ( exp ) statement | if ( exp ) statement else statement exp 0 | 1 if (0) if (1) other else other if ( exp 0 if statement if-stmt ) statement else if-stmt ( exp 1 statement ( exp if other ) statement other ) if-stmt 0 if ( exp 1 statement ) statement other else statement other 44
문법 모호성: Dangling Else (2) • 문법 수정을 통해서 statement if-stmt | other if-stmt if ( exp ) statement | if ( exp ) statement else statement exp 0 | 1 statement matched-stmt | unmatched-stmt if (exp) matched-stmt else matched-stmt | other unmatched-stmt if (exp) statement | if (exp) matched-stmt else unmatched-stmt exp 0 | 1 45
예제 • 다음 문법은 모호한가? exp → factor op factor | factor → (exp ) | number op → + | - | * exp → exp addop exp | term addop → + | term → term mulop term | factor mulop → * factor → (exp ) | number 47
모호함이 없도록 문법 수정 • 다음 문법을 고려하라. exp → factor op factor | factor → (exp ) | number op → + | - | * 연산자 우선순위는? 연산자 결합규칙은? exp → exp addop exp | term addop → + | term → term mulop term | factor mulop → * factor → (exp ) | number exp → exp addop term | term addop → + | term → term mulop factor | factor mulop → * factor → (exp ) | number 48
모호함이 없도록 문법 수정 • 다음 문법을 고려하라. exp → factor op factor | factor → (exp ) | number op → + | - | * 연산자 우선순위는? 연산자 결합규칙은? exp → exp addop exp | term addop → + | term → term mulop term | factor mulop → * factor → (exp ) | number exp → exp addop term | term addop → + | term → term mulop factor | factor mulop → * factor → (exp ) | number 좌 순환 규칙은 좌 결합을, 우순환 규칙은 우결합을 표현 49
예제 • 예제: 다음 문법은 모호한가? stmt-sequence ; stmt-sequence | stmt s 50
TINY Grammar: program stmt-sequence ; statement | statement if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt if-stmt if exp then stmt-sequence end | if exp then stmt-sequence else stmt-sequence end repeat-stmt repeat stmt-sequence until exp assign-stmt identifier : = exp read-stmt read identifier write-stmt write exp simple-exp comparison-op simple-exp | simple-exp comparison-op < | = simple-exp addop term | term addop + | term mulop factor | factor mulop * | / factor ( exp ) | number | identifier 52
TINY 예제 프로그램 read x; if 0 < x then fact : = 1; repeat fact : = fact * x; x : = x – 1; until x = 0; write fact end program stmt-sequence ; statement | statement if-stmt | repeat-stmt | assign-stmt | read-stmt | write -stmt if-stmt if exp then stmt-sequence end | if exp then stmt-sequence else stmt-sequence end repeat-stmt repeat stmt-sequence until exp assign-stmt identifier : = exp read-stmt read identifier write-stmt write exp simple-exp comparison-op simple-exp | simple-exp comparison-op < | = simple-exp addop term | term addop + | term mulop factor | factor mulop * | / factor ( exp ) | number | identifier 53
TINY 구문 트리 구조 typedef enum {Stmt. K, Exp. K} Node. Kind; typedef enum {If. K, Repeat. K, Assign. K, Read. K, Write. K} Stmt. Kind; typedef enum {Op. K, Const. K, Id. K} Exp. Kind; program stmt-sequence ; statement | statement /* Exp. Type is used for type checking */ statement if-stmt | repeat-stmt | assign-stmt | read-stmt | typedef enum {Void, Integer, Boolean} Exp. Type; write-stmt #define MAXCHILDREN 3 if-stmt if exp then stmt-sequence end | if exp then stmt-sequence else stmt-sequence end repeat-stmt repeat stmt-sequence until exp assign-stmt identifier : = exp read-stmt read identifier write-stmt write exp typedef struct tree. Node { struct tree. Node * child[MAXCHILDREN]; struct tree. Node * sibling; int lineno; Node. Kind nodekind; exp simple-exp comparison-op simple-exp | simple-exp union {Stmt. Kind stmt; Exp. Kind exp; } kind; comparison-op < | = union {Token. Type op; simple-exp addop term | term int val; addop + | char * name; } attr; Exp. Type type; /* for type checking of exps */ term mulop factor | factor mulop * | / } Tree. Node; 54 For Id, read, assign stmt factor ( exp ) | number | identifier
program stmt-sequence ; statement | statement if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt if-stmt if exp then stmt-sequence end | if exp then stmt-sequence else stmt-sequence end repeat-stmt repeat stmt-sequence until exp assign-stmt identifier : = exp read-stmt read identifier write-stmt write exp 구문 트리 • 시퀀스 exp simple-exp comparison-op simple-exp | simple-exp comparison-op < | = simple-exp addop term | term addop + | term mulop factor | factor mulop * | / factor ( exp ) | number | identifier • If-문 if Test then-part else-part repeat Body test 55
program stmt-sequence ; statement | statement 구문 트리 Assign <name> write Op (<opkind>) statement if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt if-stmt if exp then stmt-sequence end | if exp then stmt-sequence else stmt-sequence end repeat-stmt repeat stmt-sequence until exp assign-stmt identifier : = exp read-stmt read identifier write-stmt write exp simple-exp comparison-op simple-exp | simple-exp comparison-op < | = simple-exp addop term | term addop + | - expression left operand right operand term mulop factor | factor mulop * | / factor ( exp ) | number | identifier • 다른 노드들은 잎 노드이다 – Read 문, 식별자-식, 상수-식 56
구문 트리 예: sample. tny read x; if 0 < x then fact : = 1; repeat fact : = fact * x; x : = x – 1; until x = 0; write fact end 속성 57
Extra Notation: • Backus-Naur Form (BNF) – 메타기호: | • Extended BNF (EBNF): – 새로운 메타기호 도입: […], {…} – 은 제거 가능 • 괄호는? Yes/No – exp (+ | -) term | term – exp + term | exp - term | term 58
EBNF 메타기호 • Brackets […]: “optional” (정규식의 ‘ ? ’와 유사) – exp term ‘|’ exp | term => exp term [ ‘|’ exp ] – if-stmt if ( exp ) stmt | if ( exp )stmt else stmt => if-stmt if ( exp ) stmt [ else stmt ] 59
EBNF 메타기호 • Braces {…}: “repetition” (정규식의 ‘*’와 유사) – Left recursive form: A A | => A { } – Right recursive form: A A | => A { } 60
EBNF 예: 단순 식 exp term { addop term } addop + | - exp → exp addop term | term addop → + | term → term mulop factor | factor mulop → * factor → (exp ) | number term factor { mulop factor } mulop * factor ( exp ) | number 62
예제: 구문 다이어그램 • 다음 BNF를 EBNF로 변환하라. exp → exp addop term | term addop → + | term → term mulop factor | factor mulop → * factor → (exp ) | number • EBNF에 대한 구문 다이어그램을 그려라. 64
- Slides: 64