2013-04-14 5 views
0

"IF ELSE"문을 사용하여 자체 계산기를 구현하려고합니다. 나는이 같은 "IF"문을 추가하면 이해가 안기본 계산기 내부의 "IF ELSE"문

/* description: Parses end executes mathematical expressions. */ 

/* lexical grammar */ 
%lex 
%% 

\s+     /* skip whitespace */ 
[0-9]+("."[0-9]+)?\b return 'NUMBER' 
"*"     return '*' 
"/"     return '/' 
"-"     return '-' 
"+"     return '+' 
"^"     return '^' 
"("     return '(' 
")"     return ')' 
"PI"     return 'PI' 
"E"     return 'E' 
<<EOF>>    return 'EOF' 
.      return 'INVALID' 

/lex 

/* operator associations and precedence */ 

%left '+' '-' 
%left '*' '/' 
%left '^' 
%left UMINUS 

%start expressions 

%% /* language grammar */ 

expressions 
    : e EOF 
     {return $1;} 
    ; 

e 
    : e '+' e 
     {$$ = $1+$3;} 
    | e '-' e 
     {$$ = $1-$3;} 
    | e '*' e 
     {$$ = $1*$3;} 
    | e '/' e 
     {$$ = $1/$3;} 
    | e '^' e 
     {$$ = Math.pow($1, $3);} 
    | '-' e %prec UMINUS 
     {$$ = -$2;} 
    | '(' e ')' 
     {$$ = $2;} 
    | NUMBER 
     {$$ = Number(yytext);} 
    | E 
     {$$ = Math.E;} 
    | PI 
     {$$ = Math.PI;} 
    ; 

: 파서 ​​잘 생성

IfStatement 
: "IF" "(" Expression ")" Statement 
    { 
     $$ = new IfStatementNode($3, $5, null, createSourceLocation(null, @1, @5)); 
    } 
| "IF" "(" Expression ")" Statement "ELSE" Statement 
    { 
     $$ = new IfStatementNode($3, $5, $7, createSourceLocation(null, @1, @7)); 
    } 
; 

다음은 기본 계산기의 예입니다. 그래서 IF (5> 2) THEN (5 + 2) ELSE (5 * 2)와 같은 문을 어떻게 사용할 수 있습니까? 계산기의 기능은 물론 잘 작동하지만 "IF"는 그렇지 않습니다.

+0

'IfStatement'가 비 터미널에서 시작할 수 있습니까? –

+0

Bryan Olivier, 적어도 그렇게해야합니다. – Paul

답변

1

IF 문과 IF 식의 두 종류의 구문을 찾고있는 것으로 보입니다. 다행히도 예제에서는 THEN 키워드를 사용하여 구분합니다. IF 식 제작은 다음과 같을 것입니다 :

IfExpression 
: "IF" "(" Expression ")" "THEN" "(" Expression ")" 
    { 
     $$ = new IfExpressionNode(/* pass arguments as desired */); 
    } 
| "IF" "(" Expression ")" "THEN" "(" Expression ")" "ELSE" "(" Expression ")" 
    { 
     $$ = new IfExpressionNode(/* arguments */); 
    } 
;