2013-04-30 24 views
1

我試圖在bison中獲取令牌的值,但似乎我一次獲得多個令牌。 這裏是我的Flex代碼:在flex和bison中獲取字符串令牌值超過預期

%{ 
    #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( 'for循環');.該程序只能得到forloop,但它會得到forloop'); 但是當我像這樣一行一行地輸入: forloop ' ) ; 僅顯示forloop 什麼可能導致此問題?

+0

小心標記; Flex標籤用於Adobe/Apache UI框架。 – JeffryHouser 2013-04-30 13:12:25

回答

1

在將它傳遞給bison之前,您必須先處理或複製yytextbison將要求從掃描儀向前看令牌,這些將覆蓋任何yytext

對於標識符通常爲strdup或使用ANSI-C等價物。如果語言只有一個名稱空間,或者已經可以在掃描器中區分名稱空間,則通常直接在掃描器中構建符號表並僅傳遞一些標識符。

對於數字,通常會確定數字的值並將其傳遞給解析器。

上面的一些術語對您而言可能並不熟悉,但您應該調查它們的含義。

+0

有什麼想法如何做到這一點?因爲我不知道 – 2013-04-30 13:18:38

+0

我在答案中增加了一些更多的指針。 – 2013-04-30 13:39:30