2016-12-02 11 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ルールは' -single引用符で直接文字を使用する必要があります。

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関数を使用してこれらの2つの文字列を連結できますか? – PramodHegde

+0

いいえ - 'strcat'は、目的地が結果を保持するのに十分な大きさでなければならず、' strdup'によって割り当てられたバッファは文字列を保持するのに十分なだけです。あなたのシステムで利用可能な場合、 'asprintf'を使用することができます。 –

関連する問題