0

我想为特定语言编写一个小编辑器。在编辑器中,我们可以添加indent一行或多行(即在每行左侧添加空格);我们还将能够format修改整个代码(即,在适当的位置更改空格和换行符)。

ocamllex给定一个程序,我的前端ocamlyacc可以构建一个Abstract Syntax Tree (AST). 我想知道在 AST 中存储元素位置的常用方法。

position 我猜的一种方法是在 AST 的每个元素上附加一个(开始) 。例如,如果表达式的类型定义如下:

type expression =
  ...
  | E_int of int
  | E_function_EEs of Function.t * (expression list)

它会变成:

type expression =
  ...
  | E_int of position * int
  | E_function_EEs of position * Function.t * (expression list)

然后,如果我们知道每个元素的长度,我们就可以推断出所有内容在编辑器中的位置。这是一种常见的方法吗?我不觉得好看...

4

1 回答 1

0

您不必position为每个模式重复。你可以在最后写一个:

type expression = 
  ...
  | E_int of int
  | E_function_EEs of Function.t * (expression list)
  | E_loc of position * expression

因此,对于现有的超过 的功能expression,您只需为 增加一个案例E_loc,而无需触及现有案例。

E_loc在解析时自动构造,您可以添加.mly例如:

loc(EXPRESSION):
| t = EXPRESSION { E_loc (($startpos, $endpos), t) }

(* immediate construction: *)
expression:
| INT { E_loc (($startpos, $endpos), E_int $1) }

(* or delay construction: *)
expression:
| e0 = loc(expression) PLUS e1 = loc(expression) { E_function_EEs (Function.PLUS, [e0; e1]) }
于 2016-06-05T00:48:40.243 回答