我正在OCaml中编写解析器。我已经编写了解析器;现在我正试图建立一个AST来建立一个AST。以下是解析器的示例:
PARSER:
expr:
| THE boiluser HAS l_ent {structural($2,$4)}
;
boiluser:
| USER boiluser USER {}
;
l_ent:
boiluser {[$1]}
| l_ent boiluser{ [$2::$1] } ;
在AST中,我想要关联$2
和$4
。我正在考虑使用哈希表,但我不知道如何做到这一点。当我“致电”$1
时,我怎么知道将其与$4
相关联?
答案 0 :(得分:2)
你的问题不清楚:我很难理解英语,而且更难以理解你所要求的东西(一旦被破译)。
通用建议不是在解析阶段进行任何分析/处理:只需解析输入,并返回忠实代表它的AST(模数消歧和琐碎的具体语法细节)。您将能够实现任何进一步的处理(例如在某些标识符和某些数据之间构建关联表)作为在返回的AST上运行的函数。这样更清洁,更容易做到。
我看到你正在使用旧程序ocamlyacc。您是否了解Menhir,这是一个更易于使用的解析器生成器,可以产生更好的语法描述(例如使用变量名而不是$1 $2 $3
)?如果你有机会,你应该考虑转换 - 如果你是学生,考虑报告给你的老师,这样他就可以通过在课程中使用menhir来改善每个人的生活。
答案 1 :(得分:1)
我不知道你的意思是“创建一个锚点”所以我根据你的代码做出猜测:
规则的类型是右侧的类型,因此在您的情况下, boiluser 的类型为单位(同样适用于它的价值):
boiluser:
| USER boiluser USER {}
所以当你在另一条规则中使用它时:
expr:
| THE boiluser HAS l_ent {structural($2,$4)}
$ 2 的值总是单位!规则 expr 的类型将是函数结构的类型,结构将为的具体值返回的值$ 2 和 $ 4 。