U E D R , A S I H C RSS

New Compile Error/2014_08_02

수식을 다루는 것과 언어를 다루는 것의 차이

  • 당연히 언어의 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 
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:51
Processing time 0.0296 sec