如何在AST中的yacc ocaml中创建锚点

时间:2012-05-04 00:54:09

标签: ocaml yacc

我正在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相关联?

2 个答案:

答案 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