2016-12-02 69 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的代碼:

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

輸入: sinx的+ cosx

輸出: sinx的+ cosx + cosxcosx

觀察輸出的代碼!

+0

如果我要打印$ 1中。其印刷整個輸入sinx + cosx – PramodHegde

回答

0

yytext是一個指針到柔性的內部掃描緩衝器,所以,當讀取下一個標記它的內容將被修改。如果你想將它返回給解析器,你需要做一個副本:

[+-] { 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

否 - 'strcat'要求目標足夠大以保存結果,並且'strdup'分配的緩衝區只有足夠大的空間來容納字符串。如果您的系統可用,則可以使用'asprintf'。 –