c - 在 flex 和 bison 中获取超出预期的字符串标记值

标签 c bison flex-lexer

我尝试获取bison中token的值,但是好像一次获取了不止一个token。 这是我的弹性代码:

    %{
    #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;}
    ....

这是我的 Bison 代码:

    %{
    #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 什么可能导致这个问题?

最佳答案

在将它传递给 bison 之前,您必须处理或复制 yytextbison 将从扫描仪请求前瞻 token ,这些 token 将覆盖任何 yytext

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

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

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

关于c - 在 flex 和 bison 中获取超出预期的字符串标记值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16300326/

相关文章:

c - 系统返回值 ("path/a.out")

c++ - Bison :如果结构不好

parsing - yacc/byacc/bison 和 lex/flex 的适当用途

c++ - 如何修复下一个线程更正确?使用线程

c - 生成一个范围为 1 - 10 的随机数

c - 使用 glib 的 g_new() 进行内存分配

c++ - GNU/Flex C++ 是否有效?

yacc - 无法弄清楚是什么导致了 yacc 中的移位/减少错误

compiler-construction - 编写编译器......什么是对的,什么是错的?

c - 用 C 在 Bison 中模拟 bool 值