string - 在 Bison 中使用yylval恢复字符串

标签 string bison

嗨,我在读取特定 token 时如何获取char *感到困惑...
我浏览各种站点,它们提供了一些建议,但并不完整,例如,缺少yylval和yytext声明或如何转换类型,等等。

.l文件中需要什么?
.y文件中需要什么?

是)我有的

在.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

在野牛手册中,yylval是一个宏,我知道一个宏已被其他文本替换为文本,但是在这种情况下,我确实无法理解。

最佳答案

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

yylval是一个工会,您可以声明,否则野牛将自动声明。野牛的默认yylval本质上是无用的。您可以在解析器中使用%union { ... }声明yylval,因为您可能需要将其他值从扫描仪返回到解析器。例如,当您在扫描仪中匹配数字时,您将需要返回T_NUM之类的 token 。但是您很可能还想要该数字的值,这是yylval派上用场的地方。使用yylval,如果您有一个整数字段,则可以在扫描仪中简单地执行yylval.num = atoi(yytext),然后在解析器中使用该num字段。

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

使用bison将解析器编译为.tab.c文件时,请使用bison -d -t标志调试符号和头文件。头文件将被称为* .tab.h。将其包括在扫描仪中,因此您只需要声明一次 token 名称并正确使用yylval。

关于string - 在 Bison 中使用yylval恢复字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287883/

相关文章:

Java 字符串数组插入排序

grammar - Bison 转移-减少冲突

c++ - 在 C++ 中嵌入 Guile 的问题

compiler-construction - 如何使用缩进作为带有 bison 和 flex 的 block 分隔符

c++ - Flex/Bison:构建示例项目以生成Cpp时出错

javascript - 在字符串中的字符之间添加空格

c++ - C++中字符串的加号运算符

php - PHP判断字符串中特殊字符的位置

c++ - 二进制搜索树读取字符串? C++

c - yacc - 字段的类型不完整