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'); 但是当我像这样逐行输入时:forloop'); 它只显示forloop 什么可能导致这个问题?

4

2 回答 2

1

在将其yytext传递给bison. bison将从扫描仪请求前瞻令牌,这些令牌将覆盖任何yytext.

对于标识符,通常strdup使用或使用 ANSI-C 等效项。如果语言只有一个命名空间,或者在扫描器中已经可以区分命名空间,则习惯上直接在扫描器中建立符号表,只传递一些标识符。

对于数字,通常会确定数字的值并将其传递给解析器。

上面的某些术语您可能不熟悉,但值得您研究它们的含义。

于 2013-04-30T12:57:06.900 回答
-1

这确实是一个常见问题解答,看到它被反复询问让我想知道为什么这种问题没有被标记为重复。甚至 Bison 也有关于它的常见问题解答。 http://www.gnu.org/software/bison/manual/html_node/Strings-are-Destroyed.html

于 2013-05-01T10:05:48.753 回答