More actions
imported>Kesarr No edit summary |
imported>syjsmk No edit summary |
||
| (4 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
program ::= (variable-def | function-def)* function-def ::= typespecifier ID params compound-stmt variable-def ::= typespecifier init-decl-list “;” init-decl-list ::= init-decl (“,” init-decl)* init-decl ::= declarator (“=” initializer)? declarator ::= ID | ID “[“ INTLITERAL “]” initializer ::= expr | “{“ expr ( “,” expr )* “}” typespecifier ::= void | int | bool | float compound-stmt ::= “{” variable-def* stmt* “}” stmt ::= compound-stmt | if-stmt | while-stmt | for-stmt | return expr? “;” | ID “=” expr “;” | ID “[” expr “]” “=” expr “;” | ID arglist “;” if-stmt ::= if “(” expr “)” stmt ( else stmt )? while-stmt ::= while “(“ expr “)” stmt for-stmt ::= for “(“ asgnexpr? ”;” expr? “;” asgnexpr? “)” stmt expr ::= or-expr or-expr ::= and-expr | or-expr “||” and-expr and-expr ::= relational-expr | and-expr “&&” relational-expr relational-expr ::= add-expr | add-expr “==” add-expr | add-expr “!=” add-expr | add-expr “<” add-expr | add-expr “<=” add-expr | add-expr “>” add-expr | add-expr “>=” add-expr add-expr ::= mult-expr | add-expr “+” mult-expr | add-expr “-“ mult-expr | == 수식을 다루는 것과 언어를 다루는 것의 차이 == | ||
mult-expr ::= unary-expr | mult-expr “*” unary-expr | mult-expr “/” unary-expr unary-expr ::= primary-expr | “+” unary-expr | “-“ unary-expr | “!” unary-expr primary-expr ::= ID arglist? | ID “[“ expr “]” | “(“ expr “)” | INTLITERAL | BOOLLITERAL | FLOATLITERAL | STRINGLITERAL asgnexpr ::= ID “=” expr params ::= “(“ params-list? “)” params-list ::= parameter-decl ( “,” parameter-decl )* parameter-decl ::= typespecifier declarator arglist ::= “(“ args? “)” args ::= arg ( “,” arg )* arg ::= expr | * 당연히 언어의 BNF가 훨씬 복잡함. | ||
* context sensitive한 요소들이 더 많음. | |||
** 이를 위해 필요한 정보들을 컴파일타임에 관리해야 함. | |||
** 예를들어 scope와 scope 내부의 symbol들을 테이블로 관리해야 하는 것 등이 있음. 수식을 다룰 때는 symbol이 없었음. | |||
int a = 1; | |||
char* s(); | |||
s = a(); | |||
// 같은 것이 context sensitive한 경우에 들어감. | |||
* 실제 실행을 위해서는 API의 구현이 필요함. | |||
** API의 구현이 없으면 연산 외 외부의 입출력과 같은 작업은 할 수 없음. | |||
** 이전까지 BNF나 변환과 관련된 얘기들은 말하자면 .j파일을 만드는 부분 까지인것임. | |||
** 실행 가능한 수준까지를 원한다면 뭔가 API의 제공이 필요함. | |||
== Mini C BNF == | |||
program ::= (variable-def | function-def)* | |||
function-def ::= typespecifier ID params compound-stmt | |||
variable-def ::= typespecifier init-decl-list “;” | |||
init-decl-list ::= init-decl (“,” init-decl)* | |||
init-decl ::= declarator (“=” initializer)? | |||
declarator ::= ID | ID “[“ INTLITERAL “]” | |||
initializer ::= expr | “{“ expr ( “,” expr )* “}” | |||
typespecifier ::= void | int | bool | float | |||
compound-stmt ::= “{” variable-def* stmt* “}” | |||
stmt ::= compound-stmt | if-stmt | while-stmt | for-stmt | return expr? “;” | ID “=” expr “;” | ID “[” expr “]” “=” expr “;” | ID arglist “;” | |||
if-stmt ::= if “(” expr “)” stmt ( else stmt )? | |||
while-stmt ::= while “(“ expr “)” stmt | |||
for-stmt ::= for “(“ asgnexpr? ”;” expr? “;” asgnexpr? “)” stmt | |||
expr ::= or-expr | |||
or-expr ::= and-expr | or-expr “||” and-expr | |||
and-expr ::= relational-expr | and-expr “&&” relational-expr | |||
relational-expr ::= add-expr | add-expr “==” add-expr | add-expr “!=” add-expr | add-expr “<” add-expr | add-expr “<=” add-expr | add-expr “>” add-expr | add-expr “>=” add-expr | |||
add-expr ::= mult-expr | add-expr “+” mult-expr | add-expr “-“ mult-expr | |||
mult-expr ::= unary-expr | mult-expr “*” unary-expr | mult-expr “/” unary-expr | |||
unary-expr ::= primary-expr | “+” unary-expr | “-“ unary-expr | “!” unary-expr | |||
primary-expr ::= ID arglist? | ID “[“ expr “]” | “(“ expr “)” | INTLITERAL | BOOLLITERAL | FLOATLITERAL | STRINGLITERAL | |||
asgnexpr ::= ID “=” expr | |||
params ::= “(“ params-list? “)” | |||
params-list ::= parameter-decl ( “,” parameter-decl )* | |||
parameter-decl ::= typespecifier declarator | |||
arglist ::= “(“ args? “)” | |||
args ::= arg ( “,” arg )* | |||
arg ::= expr | |||
* [[:File:compiler_ex_ch_12________.pdf|compiler_ex_ch_12________.pdf]] | |||
Latest revision as of 07:34, 7 August 2014
수식을 다루는 것과 언어를 다루는 것의 차이
- 당연히 언어의 BNF가 훨씬 복잡함.
- context sensitive한 요소들이 더 많음.
- 이를 위해 필요한 정보들을 컴파일타임에 관리해야 함.
- 예를들어 scope와 scope 내부의 symbol들을 테이블로 관리해야 하는 것 등이 있음. 수식을 다룰 때는 symbol이 없었음.
int a = 1; char* s(); s = a(); // 같은 것이 context sensitive한 경우에 들어감.
- 실제 실행을 위해서는 API의 구현이 필요함.
- API의 구현이 없으면 연산 외 외부의 입출력과 같은 작업은 할 수 없음.
- 이전까지 BNF나 변환과 관련된 얘기들은 말하자면 .j파일을 만드는 부분 까지인것임.
- 실행 가능한 수준까지를 원한다면 뭔가 API의 제공이 필요함.
Mini C BNF
program ::= (variable-def | function-def)*
function-def ::= typespecifier ID params compound-stmt
variable-def ::= typespecifier init-decl-list “;”
init-decl-list ::= init-decl (“,” init-decl)*
init-decl ::= declarator (“=” initializer)?
declarator ::= ID | ID “[“ INTLITERAL “]”
initializer ::= expr | “{“ expr ( “,” expr )* “}”
typespecifier ::= void | int | bool | float
compound-stmt ::= “{” variable-def* stmt* “}”
stmt ::= compound-stmt | if-stmt | while-stmt | for-stmt | return expr? “;” | ID “=” expr “;” | ID “[” expr “]” “=” expr “;” | ID arglist “;”
if-stmt ::= if “(” expr “)” stmt ( else stmt )?
while-stmt ::= while “(“ expr “)” stmt
for-stmt ::= for “(“ asgnexpr? ”;” expr? “;” asgnexpr? “)” stmt
expr ::= or-expr
or-expr ::= and-expr | or-expr “||” and-expr
and-expr ::= relational-expr | and-expr “&&” relational-expr
relational-expr ::= add-expr | add-expr “==” add-expr | add-expr “!=” add-expr | add-expr “<” add-expr | add-expr “<=” add-expr | add-expr “>” add-expr | add-expr “>=” add-expr
add-expr ::= mult-expr | add-expr “+” mult-expr | add-expr “-“ mult-expr
mult-expr ::= unary-expr | mult-expr “*” unary-expr | mult-expr “/” unary-expr
unary-expr ::= primary-expr | “+” unary-expr | “-“ unary-expr | “!” unary-expr
primary-expr ::= ID arglist? | ID “[“ expr “]” | “(“ expr “)” | INTLITERAL | BOOLLITERAL | FLOATLITERAL | STRINGLITERAL
asgnexpr ::= ID “=” expr
params ::= “(“ params-list? “)”
params-list ::= parameter-decl ( “,” parameter-decl )*
parameter-decl ::= typespecifier declarator
arglist ::= “(“ args? “)”
args ::= arg ( “,” arg )*
arg ::= expr