2

バイソンでトークンの値を取得しようとしましたが、一度に複数のトークンを取得しているようです。ここに私のフレックスコードがあります:

    %{
    #include <stdio.h>
    #include "y.tab.h"
    //YYSTYPE yylval;
    %}
    semicolon   [;]
    var [a-c]
    digit   [0-9]+
    string [a-zA-Z]+
    %%
    Counter {yylval = yytext; return VAR;}
    [a-zA-Z0-9]+ { yylval = yytext; return STRING;}
    ....

ここに私のバイソンコードがあります:

    %{
    #define YYSTYPE char *
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    int limit;
    int input;
    int count=0;
    char a[20];
    char message[200];
    %}
    %token DIGIT VAR OPENPAR CLOSEPAR PETIK
    %token WRITELN DO FOR BEGINKEY END TO EQUAL
    %token SEMICOLON VARKEY COLON TYPE STRING READLN
    %start program
    %%

    program: dlist slist {printf("L3: HALT");}
      ;

    dlist:  /* nothing */
      | decl dlist 
      ;

    decl:   VARKEY VAR COLON TYPE SEMICOLON 
      ;

    slist:  stmt 
      | stmt slist
      | BEGINKEY FOR VAR EQUAL DIGIT TO DIGIT DO slist END 
        { 
          printf("\nBeginFunc\n");
          printf("t%d = %d;\n",count,$5);
          printf("%s = t%d\n",$3,count); 

      ....

問題は、writeln('forloop'); を入力するときです。プログラムは forloop のみを取得する必要がありますが、forloop を取得します'); しかし、次のように 1 行ずつ入力すると: forloop '); forloop のみが表示されます。この問題の原因は何ですか?

4

2 に答える 2

1

yytextに渡す前に、処理または複製する必要がありますbisonbisonはスキャナーから先読みトークンを要求し、それらはすべてを上書きしますyytext

識別子には、通常、strdupまたは同等の ANSI-C が使用されます。言語に名前空間が 1 つしかない場合、または名前空間がスキャナーで既に識別できる場合は、スキャナーでシンボル テーブルを直接構築し、識別子の番号のみを渡すのが通例です。

数値の場合、通常、数値の値が決定され、パーサーに渡されます。

上記の用語のいくつかはなじみのないものかもしれませんが、それらの意味を調べる価値はあります。

于 2013-04-30T12:57:06.900 に答える
-1

これは実際には FAQ であり、繰り返し質問されているのを見ると、なぜこの種の質問が重複としてフラグ付けされないのか疑問に思います。Bison にも FAQ があります。 http://www.gnu.org/software/bison/manual/html_node/Strings-are-Destroyed.html

于 2013-05-01T10:05:48.753 に答える