c – 使用Bison构建AST
发布时间:2020-12-16 07:29:34 所属栏目:百科 来源:网络整理
导读:我正在与Bison合作为我正在编写的编译器构建AST.在AST中构建节点的最佳方法是什么?我的问题可能更清楚一个例子. 给出以下代码段: field : modifier type TOK_IDENT TOK_SEMICOLON { // I want to return a pointer to a node of type Field // i.e. $$= ne
我正在与Bison合作为我正在编写的编译器构建AST.在AST中构建节点的最佳方法是什么?我的问题可能更清楚一个例子.
给出以下代码段: field : modifier type TOK_IDENT TOK_SEMICOLON { // I want to return a pointer to a node of type Field // i.e. $$= new Field(name,isVisible,isStatic,type); } ; modifier : visibility_opt static_opt { // Should I make the new Field here and pass it up? // Or a new type that contains both vis and static options? } ; visibility_opt : /* default */ { $$= true; } | TOK_PUBLIC { $$= true; } | TOK_PRIVATE { $$= false; } ; static_opt : /* default */ { $$= false; } | TOK_STATIC { $$= true; } ; 在上面的例子中,我希望字段规则返回一个Field节点,但我需要在解析过程中传递的修饰符规则的一些属性(即这些是合成属性). 在不改变语法的情况下,我可以想到两种方法. >使非终端修饰符具有类型字段,在此处创建新字段,填写我可以填写的内容,并将其传递到字段以填写其余内容. 在这样的情况下,首选的方式是什么? 解决方法
像其他人一样,建议首选的方法是使用带有可见性和静态选项的struct Modifier.但我可能会把它变成一个静态修饰符,因为它不会被传递到字段中,而只是用于提取值然后传递给Field.您甚至可以在堆栈中分配它,并重复使用它以加快速度.
以下内容: static struct { boolean vis_opt; boolean static_opt; } mod; field : modifier type TOK_IDENT TOK_SEMICOLON { $$= new Field(...,mod.vis_opt,mod.static_opt,...); } ; modifier : visibility_opt static_opt { mod.vis_opt = $1; mod.static_opt = $2; } ; visibility_opt : /* default */ { $$= true; } | TOK_PUBLIC { $$= true; } | TOK_PRIVATE { $$= false; } ; static_opt : /* default */ { $$= false; } | TOK_STATIC { $$= true; } ; 此外,除非您非常确定该语言的未来,否则您可能需要考虑将可见性视为枚举.你永远不知道在开发这门语言时你最终可能会想到什么样的可见性,至少如果你在enum中有它,那么以后更容易扩展. 请享用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |