나는 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();
}
}