1

我正在用 OCaml 编写解析器。我已经写了解析器;现在我正在尝试关联令牌以构建 AST。这是解析器的示例:

解析器:

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

4

2 回答 2

2

你的问题不清楚:我很难理解英语,而且更难(一旦破译)理解你在问什么。

一般的建议是不要在解析阶段进行任何分析/处理:只需解析您的输入,并返回一个忠实地表示它的 AST(模消歧和琐碎的具体语法细节)。您将能够实现任何进一步的处理(例如在某些标识符和某些数据之间构建关联表)作为在返回的 AST 上运行的函数。这更清洁,更容易做到。

我看到您使用的是旧程序 ocamlyacc。您是否知道Menhir是一种更易于使用并产生更好的语法描述的解析器生成器(例如使用变量名而不是$1 $2 $3)?如果你有机会,你应该考虑转换——如果你是学生,考虑向你的老师报告,这样他就可以通过在他的课程中使用竖石来改善每个人的生活。

于 2012-05-04T11:19:24.883 回答
1

我不知道您所说的“创建锚点”是什么意思,所以我根据您的代码进行猜测:

规则的类型是其右侧的类型,因此在您的情况下,boiluser的类型是unit(其值也是如此):

boiluser:
  | USER boiluser USER {}

所以当你在另一个规则中使用它时:

expr: 
  | THE boiluser HAS l_ent {structural($2,$4)}

2 美元的价值始终是单位!规则expr的类型将是函数结构的类型,无论结构为$2$4的具体值返回的值。

于 2012-05-04T05:50:43.690 回答