variables - Flex/Lex - 如何知道变量是否已声明

标签 variables yacc flex-lexer

我的语法允许:

C → id := E//将值/表达式赋给变量 (VAR)

C → print(id)//打印变量(VAR) 值

为了完成它,我的 lex 文件是:

[a-z]{
    yylval.var_index=get_var_index(yytext);
    return VAR;
}

get_var_index 返回列表中变量的索引,如果它不存在则创建一个。
这是工作!

问题是:
  • 每次在 lex 文件上匹配一个变量时,它都会为该变量创建一个索引。
  • 我必须报告是否调用了 'print(a)' 并且未声明 'a',这永远不会发生,因为 print(a) 总是为 'a' 创建一个索引。*

  • 我该如何解决?

    yacc文件的一部分:
       %union {
    int     int_val;
    int var_index;
    } 
    %token <int_val>   INTEGER
    %token <var_index>   VAR
    ...
    | PRINT '(' VAR ')'{
     n_lines++;
    printf("%d\n",values[$3]);
    }
    ...
    | VAR {$$ =values[$1];}
    

    最佳答案

    这确实有点像我们要做的计算机科学课作业问题。

    通常人们不会以这种方式使用bison/yacc。可以使用 bison/yacc 进行解析并制作一个解析树,然后遍历该树以执行语义检查,例如在使用前检查声明等。标识符通常在符号表中管理,而不仅仅是值表以启用其他属性,例如声明为管理的。正是由于这些原因,它看起来更像是一种练习,而不是工具的实际应用。好的;这些免责声明已处理,让我们来回答。

    通过记住已声明的内容和未声明的内容,可以解决问题。如果不打算使用完整的符号表,那么可以使用一个简单的 bool 数组,指示哪些是有效值。该数组可以初始化为 false 并在声明时设置为 true。使用变量时可以检查该值。如 C 使用整数作为 bool 值,我们可以使用它。唯一需要更改的是 bison/yacc。您省略了声明的任何语法,但正如您指出的那样,它们被声明必须有一些。我猜的。

    %union {
    int     int_val;
    int var_index;
    } 
    int [MAX_TABLE_SIZE] declared; /* initialize to zero before starting parse */
    %token <int_val>   INTEGER
    %token <var_index>   VAR
    ...
    | DECLARE '(' VAR ')' { n_lines++; declared[$3] = 1; }
    ...
    | PRINT '(' VAR ')'{
     n_lines++;
    if (declared[$3]) printf("%d\n",values[$3]);
    else printf("Variable undeclared\n");
    }
    ...
    | VAR {$$ =value[$1]; /* perhaps need to show more syntax to show how VAR used */}
    

    关于variables - Flex/Lex - 如何知道变量是否已声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27284546/

    相关文章:

    string - 戈兰 : how to sum an array of integers as strings and numbers

    jquery添加到循环中的变量

    javascript - 将 mysql_fetch_array 中的 php 数据保存为脚本变量

    c - 为解析器编写规则

    c++ - Flex & Bison C++

    R:创建名称来自变量的新列

    c - YACC/LEX 从 C 文件调用解析器

    objective-c - 在 Xcode 中使用 Yacc 和 Lex

    c - FLEX- Bison : error: expected identifier or ‘(’ before string constant

    c - 如何使用 flex/bison 生成代码并将其放入文件