获取flex和bison中的String标记值超出预期

时间:2013-04-30 12:48:16

标签: c bison flex-lexer

我试图在野牛中获取令牌的价值,但似乎我一次获得了多个令牌。 这是我的灵活代码:

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

2 个答案:

答案 0 :(得分:1)

在将yytext传递给bison之前,您必须先处理或复制bisonyytext会请求扫描仪提前查看令牌,这些令牌会覆盖任何strdup

对于标识符,通常使用{{1}}或ANSI-C等效项。如果语言只有一个命名空间或者已经可以在扫描程序中区分命名空间,那么通常直接在扫描程序中构建符号表并仅传递一些标识符。

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

您可能不熟悉上述某些条款,但您​​需要调查它们的含义。

答案 1 :(得分:0)

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