2016-12-02 13 views
0

다음과 같은 lex 및 yacc 코드가 있습니다. 나는 누군가가 말할 수있는 인쇄 된 성명서에서 여분의 가치를 얻고있다. 코드에 무슨 문제가 있습니까?lex 및 yacc을 사용하여 삼자 연산 표현을 구문 분석하십시오.

렉스 번호 :

%{ 
#include <stdio.h> 
#include "y.tab.h" 
%} 

%% 
[ \t] ; 
[+-] { yylval=yytext; return Sym;} 
(s|c|t)..x { yylval=yytext; return Str;} 
[a-zA-Z]+ { printf("Invalid");} 
%% 
int yywrap() 
{ 
return 1; 
} 

은 yacc 번호 : 출력에서 ​​ SiNx로 + cosx + cosxcosx

보면 :

%{ 
#include<stdio.h> 
%} 

%start exps 
%token Sym Str 

%% 
exps: exps exp 
    | exp 
    ; 
exp : Str Sym Str {printf("%s",$1); printf("%s",$2); printf("%s",$3);} 
    ; 
%% 

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

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

입력 : + cosx

출력 SiNx로 코드의!

+0

나는 $ 1를 인쇄하려고합니다. 그것의 인쇄 전체 입력 sinx + cosx – PramodHegde

답변

0

은 flex의 내부 스캔 버퍼에 대한 포인터이므로 다음 토큰을 읽을 때 그 내용이 수정됩니다. 기호는 단일 문자입니다

[+-] { yylval=strdup(yytext); return Sym;} 
(s|c|t)..x { yylval=strdup(yytext); return Str;} 

, 그것은 스캐너에서 직접 해당 문자를 반환하는 것이 더 적합 할 수 있습니다 :

[-+] { return *yytext; } 
당신이 파서에 반환하려는 경우, 당신은 사본을 만들 필요가

는 경우에, 당신은 yacc 규칙은 ' 단수 따옴표로 직접 문자를 사용한다 :

exp : Str '+' Str {printf("%s + %s",$1, $3); free($1); free($3); } 
    | Str '-' Str {printf("%s - %s",$1, $3); free($1); free($3); } 
+0

덕분에, 그것은 효과가있다. 그 두 문자열을 연결하기 위해 strcat 함수를 사용할 수 있습니까? – PramodHegde

+0

No -'strcat'는 목적지가 결과를 담을만큼 충분히 커야하고,'strdup'에 의해 할당 된 버퍼는 문자열을 담을만큼 충분히 크다는 것을 요구합니다. 시스템에서 사용할 수있는 경우'asprintf'를 사용할 수 있습니다. –