代码之家  ›  专栏  ›  技术社区  ›  mjsr

在bison中使用yylval恢复字符串

  •  4
  • mjsr  · 技术社区  · 15 年前

    嗨,当我读到一个特定的标记时,我很困惑如何得到一个字符。。。 我浏览了很多网站,他们提供了一些建议,但并不完整,我的意思是,例如yylval和yytext声明丢失,或者如何转换类型等等

    在.l文件中需要什么? 你的档案里需要什么?

    我所拥有的

    在.l文件中:

    {WORD}      { yylval = strdup(yytext);return T_ValidWord;}
    

    在.y文件中:

    %union{
      char *str;
    }
    
    %token<str> T_ValidWord
    
    %%
    
    element:
    T_OpenTag T_ValidWord ele1 {printf("%s", $2);}
    ; 
    

    错误:

    xml.lex: In function ‘yylex’:
    xml.lex:34: error: incompatible types when assigning to type ‘YYSTYPE’ from type ‘char *’
    

    更让我困惑的是: 在某些地方我看到

    yylval->something = yytext
    yylval.something = yytext
    yylval = yytext
    

    在bison的手册中告诉我yylval是一个宏,我知道一个宏是文本替换为其他文本,但在这种情况下我真的不明白。

    1 回复  |  直到 15 年前
        1
  •  14
  •   Kizaru    15 年前

    yylval是一种联合类型YYSTYPE。将扫描仪中的分配更改为 yylval.str = strdup(yytext) .

    yylval是一个联合体,你可以声明,或者野牛会自动声明。野牛的默认yylval基本上是无用的。您声明yylval使用 %union { ... } 因为您可能需要将其他值从扫描仪返回到解析器。例如,当您匹配扫描仪中的一个数字时,您将希望返回一个象 T_NUM . 但你很可能也想要那个数字的值,这就是yylval的用武之地。使用yylval,如果您有一个整数字段,您可以简单地 yylval.num = atoi(yytext) 在扫描仪中,然后在解析器中使用num字段。

    yytext是一个字符数组,它充当当前正在分析的输入的缓冲区。您不能声明yytext,也不应该声明yytext。

    当使用bison将解析器编译为.tab.c文件时,请使用标志 bison -d -t 用于调试符号和头文件。头文件将被称为*.tab.h。将其包含在扫描仪中,这样您只需要声明一次标记名,就可以正确使用yylval。