2017-04-04 17 views
0

나는 간단한을 구현하기 위해 노력하고 실행하면 경우 다음과 같은 형식의 Flex와 들소의 문 :들소 Yacc에 문은 항상

(표현) 왼쪽 표현이 0이 아닌 인 경우 (표현)

? 값이면 오른쪽 표현식이 실행됩니다.

들소 문법 규칙을 사용하면 누구나 내가 어떻게 할 수 있는지 보여줄 수 있습니까? enter image description here

어떻게 :

나는 그러나 그것을 실행
%union{ 
int d; 
char *s; 
} 

%token <d>INTEGER 
%token <s>VARIABLE 
%nonassoc IF 
%type <d>expr 
%type <s> statement 
%error-verbose 
%left '+' '-' 
%left '*' '/' 
%left POWER 
%right '!' 



%% 
program: 
program statement {printf("Prefix notation of given expression: %s \n", stack[head]); /*Print final expression*/ } 

| 

; 

statement: 
expr '\n' { /* printf(" = %d \n", $1); */} 
| VARIABLE '=' expr { sym[get_var_index($1)] = $3; printf(" = %d \n", $3); printf("Assigning var %s = %d index %d \n", $1, sym[get_var_index($1)],get_var_index($1)); } 
| '(' expr ')' IF '('statement')' '\n' {printf("Bison found if statement: if(stmnt) then stmnt \n"); ($2)?$6: printf("False \n");} 
|'\n' 

; 

expr: 
INTEGER { $$ = $1; pushInt($1); printf("Got an Integer %d \n", $1);} 
| VARIABLE { $$= sym[get_var_index($1)]; pushChars($1); printf("Printing %s = %d \n", $1, sym[get_var_index($1)]); } 
| expr '+' expr { $$ = $1 + $3; popAndCalc("+"); } 
| expr '-' expr { $$ = $1 - $3; popAndCalc("-"); } 
| expr '*' expr { $$ = $1 * $3; popAndCalc("*"); } 
| expr '/' expr { $$ = $1/$3; popAndCalc("/"); } 
| expr POWER expr { $$ = pow($1, $3); popAndCalc("**"); } 
| '(' expr ')' { $$ = $2;} 
| '!' expr { $$ = !$2; popAndCalc("!"); } 

는, 그것이 거짓도 블록을 실행 : 여기

내가 지금까지 무엇을 보여줍니다 내 들소 코드의 PIEC입니다 이 문제가 해결됩니까? 나는 뭔가를 놓치고 있다고 생각합니다. 도와주세요.

답변

3

중요한 문제는 구문 분석 할 때 코드를 무조건 실행한다는 것입니다. 따라서 프로그램의 모든 내용은 상황에 관계없이 정확히 한 번 실행됩니다. 문제의 일반적인 해결책은 구문 분석에서 실행을 분리하는 것입니다. 구문 분석 할 때 실행하는 대신 나중에 수행 할 수있는 일종의 데이터 구조로 파싱합니다. 그런 다음 일부 코드를 실행하려면 해당 코드 만 실행하면됩니다. 이것은 조건, 루프, 기능 및 향후 수행하고자하는 다른 것을 처리 할 수 ​​있습니다.