【问题标题】:Get String token value in flex and bison more than it is intended在 flex 和 bison 中获取字符串令牌值超出预期
【发布时间】:2013-04-30 12:48:16
【问题描述】:

我试图在 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('forloop'); 时。程序应该只得到forloop,但它得到forloop'); 但是当我像这样逐行输入时: 循环 ' ) ; 它只显示forloop 什么可能导致这个问题?

【问题讨论】:

  • 小心打标签; Flex 标签用于 Adob​​e/Apache UI 框架。

标签: c bison flex-lexer


【解决方案1】:

您必须先处理或复制yytext,然后才能将其传递给bisonbison 将从扫描仪请求前瞻令牌,这些令牌将覆盖任何 yytext

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

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

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

【讨论】:

  • 有什么想法吗?因为我不知道
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2011-12-07
    相关资源
    最近更新 更多