2016-12-02 11 views
0

Ich habe den folgenden Code für Lex und Yacc. Ich bekomme ein paar zusätzliche Werte in der gedruckten Aussage kann jemand sagen. Was ist mit dem Code falsch?lex und yacc zu trigometrischen Ausdruck zu analysieren

Lex-Code:

%{ 
#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-Code:

%{ 
#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); 
} 

Input: sinx + cosx

output: sinx + cos x + cosxcosx

Blick auf die Ausgabe des Codes !!!

+0

wenn ich 1 $ drucken versuche. es druckt die gesamte Eingabe sinx + cosx – PramodHegde

Antwort

0

yytext ist ein Zeiger in den internen Scan-Puffer von flex, so dass sein Inhalt geändert wird, wenn das nächste Token gelesen wird. Wenn Sie es an den Parser zurückkehren möchten, müssen Sie eine Kopie machen:

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

Wo Symbole ein einzelnes Zeichen sind, könnte es mehr Sinn machen, dass die Zeichen direkt in den Scanner zurückzukehren:

[-+] { return *yytext; } 

in diesem Fall sollten Sie Ihre yacc Regeln den Charakter direkt in ' -single Anführungszeichen verwenden:

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

vielen Dank, es hat funktioniert. Ich hatte noch eine Frage, kann ich die strcat-Funktion verwenden, um diese beiden Saiten zu beschreiben? – PramodHegde

+0

Nein - 'strcat' erfordert, dass das Ziel groß genug ist, um das Ergebnis zu speichern, und der von' strdup' zugewiesene Puffer ist nur groß genug, um die Zeichenfolge zu speichern. Möglicherweise können Sie 'asprintf' verwenden, wenn es auf Ihrem System verfügbar ist. –

Verwandte Themen