2017-02-19 12 views
0

나는 flex와 bison을 처음 사용하는데 간단한 계산기를 구현했습니다. 입력이 문법의 문장인지 판단하려고합니다.flex와 bison 문장이 문법의 일부인지 판단하는 방법

예를 들어 다음과 같이 입력하면 : a = 2; b = 3; a + b를 인쇄하십시오;

그것은 반환 : 실제로 계산기를 할 것입니다 지금

"A = 2, B = 3; 인쇄 A + B가 문장은"하지만 실제 계산에 대한 상관 없어 난 단지 입력이 문법의 문장인지 알고 싶습니다.

저는이 일을 어떻게 수행해야하는지 잘 모릅니다. 어떤 도움이나 힌트를 주시면 감사하겠습니다.

내 플렉스 코드 :

%{ 
     #include "y.tab.h" 
     #include <stdlib.h> 
     void yyerror(char *); 
    %} 

    %% 

    [a-z]  { 
        yylval = *yytext - 'a'; 
        return VARIABLE; 
       } 

    [0-9]+  { 
        yylval = atoi(yytext); 
        return INTEGER; 
       } 

    [-()+=/^*;]  { return *yytext; } 

    "print"   return PRINT; 

    [ \t] ;  /* skip whitespace */ 

    .    yyerror("invalid characters."); 

    %% 

    int yywrap(void) { 
     return 1; 
    } 

내 들소 코드 :

%{ 
     #include <stdio.h> 
     #include <math.h> 
     void yyerror(char *); 
     int yylex(void); 
     char *in; 
     int sym[26]; 
    %} 

    %token INTEGER VARIABLE PRINT 
    %left '+' '-' 
    %left '*' '/' 
    %right '^' 

    %% 

    program: 
      program statement    { }  
      | /* NULL */     { } 
      ; 

    statement: 
      ';'       { $$ = ';'; } 
      | expression ';'    { $$ = $1; } 
      | VARIABLE '=' expression ';' { sym[$1] = $3; } 
      | PRINT expression ';'   { printf("%d\n", $2); } 
      ; 

    expression: 
      INTEGER 
      | VARIABLE      { $$ = sym[$1]; } 
      | expression '+' expression  { $$ = $1 + $3; } 
      | expression '-' expression  { $$ = $1 - $3; } 
      | expression '*' expression  { $$ = $1 * $3; } 
      | expression '/' expression  { $$ = $1/$3; } 
      | expression '^' expression  { $$ = pow($1,$3); } 
      | '(' expression ')'   { $$ = $2; } 
      | '-' expression    { $$ = -$2; } 
      ; 

    %% 

    void yyerror(char *s) { 
     fprintf(stderr, "%s\n", s); 
    } 

    int main(void) { 
     while (1) { 
      yyparse(); 
     } 
    } 

답변

2

제 (전체) 입력 문법 일치하는지 들소 0을 반환 의해 생성 yyparse 기능, 값이 1이면 존재 구문 오류가 발생했습니다. (메모리가 부족하여 문법을 분석하려고 시도했지만 2를 반환 할 수도 있지만 yacc 호환 모드를 사용하는 경우는 드물다.)

그래서 정확성 만 검사하려면 들소 제작물의 행동; 그런 다음 입력을 구문 분석하고 yyparse의 리턴 코드를 점검 할 수 있습니다.