2

次のような出力が必要です。

a=3   mov a,3
a=fs  mov b,fs
b=32  mov b,32

3アドレス中間コード生成用のプログラム-字句解析用に記述されたlexファイルは、コマンドラインから入力を読み取り、トークンを渡します。

%{
#include "y.tab.h"
#include "string.h"
#include <math.h>
%}
%%
[a-zA-Z]+ { yylval.var=(char *)malloc(sizeof(char *));
          strcpy(yylval.var,yytext);
         return ID;}
"="       return EQUALS;
[0-9]+    {yylval.num=atoi(yytext);return DIGIT;}


%%

対応するyaccファイル:

%{

#include "stdio.h"

#include "string.h"

int yywrap()
{
return 1;
}
%}


%union
{char *var;
 int num;
}


%token <var> ID 
%token <num> EQUALS DIGIT




%%
start : line 

line : ID EQUALS DIGIT {printf("MOV %s, %d\n",$1, $3);}
     | ID EQUALS ID    {printf("MOV %s, %s\n",$1, $3);}
     ;


%%

main()

{

yyparse();

return 0;

}

int yyerror(char *s)

{
fprintf(stderr,"%s\n",s);

}

上記のコードを実行した結果(lexとyaccをリンクした後):

dsa=32                
MOV dsa, 32                // 3 address code generated

ds=342                     // but does not parse this line why??
syntax error

希望の形式で出力を取得するにはどうすればよいですか?

4

2 に答える 2

6

あなたの文法は単一を読むだけですline

多分あなたが欲しかった:

start : line
      | start line
      ;
于 2012-10-18T18:17:37.653 に答える
2

何が欲しいのか正確にはわかりません。1回の呼び出しでyyparse複数の行(EOFを取得するまですべて)を解析しますか?もしそうなら、riciの答えはあなたが望むものです。またはyyparse、1行を解析して戻り、その後、もう一度呼び出して別の行を解析しますか?それが必要な場合は、レクサーに改行を認識させ、それらのEOFを返す必要があります。

[\n]    return -1;

ただし、現在の文法では、これにより空白行の構文エラーが発生します。これは、希望するものである場合とそうでない場合があります。

于 2012-10-18T20:16:16.260 に答える