Да, тип AST может быть рекурсивным и часто таковым является. Однако правильный синтаксис будет Add of t * eprime
. Без *
t
будет рассматриваться как аргумент типа для eprime
, который не принимает ничего.
PS: Вам не нужно (и, вероятно, не следует) моделировать АСТ после грамматики так же тщательно, как и вы. Совершенно нормально иметь «левую рекурсию» в AST, даже если вы удалили ее из своей грамматики. Точно так же вам не нужно кодировать приоритет оператора в ваших типах AST так же, как вы делаете это в грамматике, поэтому, например, наличие Add
и Mult
в одном и том же типе не проблема. Имея это в виду, обычное определение AST для выражений выглядит примерно так:
type exp =
| Add of exp * exp
| Sub of exp * exp
| Mult of exp * exp
| Div of exp * exp
| FunctionCall of ident * exp list
| Var of ident
| Const of value