对结构使用 %union
using %union for structs
我搜索了很多,但似乎找不到有关如何使用 %union 是我的解析器文件的清晰示例。 例如,我想将以下令牌保存在名为classID的结构中:
[a-zA-Z][a-zA-Z0-9]* { yylval=new IDClass(yytext); return ID; }
这是我包含的.hpp
文件夹中的结构:
class Node {
public:
Node(){}
};
class IDClass : public Node {
public:
string name;
IDClass(string name):
Node(),name(name)
{}
};
然后在我的.ypp
文件中,我想使用它进行某些检查:
Define: Type ID { if(doesIDexists(***$2->name***)){errorDef(yylineno, ID_ptr->name);exit(1);}}
但显然,$2-> name不会返回它。%union 在结构中的正确用法是什么?如何正确获取名称的值?
提前谢谢你。
没有"在结构中正确使用%union
",因为%union
用于声明union
。(当然,你可以只用一个成员声明一个union
,但这几乎毫无意义。
声明不是union
语义类型的正确方法是:
%define api.value.type { Node* }
但这不会得到你想要的,因为你想要的既不是union
也不是固定类型,而是隐式动态强制转换或类似的东西。这不在野牛的选项菜单上。(很容易理解为什么不这样做。动态演员阵容不会是一个左值,所以野牛必须知道什么时候应用它,什么时候不应用它。
所以你可以使用上面的%define api.value.type
,然后写出语法操作:
Define: Type ID { if (doesIDexist(dynamic_cast<IDClass>($2)->name)) {
errorDef(@2.first_line,
dynamic_cast<IDClass>($2)->name);
exit(1);
}
}
如果您生成一个 C++ 解析器而不是恰好在 C++ 中工作的 C 解析器,那么您还有其他一些选择,这些选项可能是也可能不是对您的应用程序的更好修复。C解析器的选项在Bison手册的语言语义章节中进行了解释,C++选项有自己的章节,尽管如果您要使用C++界面,则需要阅读整个C++部分。
注意:我yylineno
更改为@2.first_line
yylineno
因为通常不准确;yylineno
通常是与前瞻标记关联的行号,该行号通常与错误不在同一行上。但你不能只是做出改变;您还必须确保您的词法分析器正确填写yylloc
。请参阅野牛手册中的跟踪位置章节。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 对结构使用 %union
- 最好使用结构的union instread的场景
- 如何将带有Union的c++结构体转换为c#