Борьба типов данных SML - PullRequest
1 голос
/ 13 марта 2012

У меня есть следующая грамматика, которую мне нужно перевести в типы данных SML:

Integer ranges over SML integer constants.
Boolean ::= 'true' | 'false'
Operator ::= 'ADD' | 'IF' | 'LESS_THAN'
Arguments ::= ( ',' Expression ) *
Expression ::= 'INT' '(' Integer ')'
            | 'BOOL' '(' Boolean ')'
            | 'OPERATION' '(' Operator ',' '[' Expression ( ',' Expression ) * ']' ')'

Мне удалось следующее:

datatype BOOL = true | false;
datatype OPERATOR = ADD | IF | LESS_THAN;
datatype INT = INT of int;

Однако я борюсь с типами данных Arguments и Expression. Любая помощь будет оценена.

1 Ответ

1 голос
/ 13 марта 2012

для ARGUMENTS вы можете использовать последовательность выражений EXPRESSION, чтобы что-то вроде списка EXPRESSION работало нормально (скобки нужно анализировать, но вам не нужно хранить их в вашем типе, так как они всегда есть)).

для ВЫРАЖЕНИЯ, вам нужно объединить подход, который вы использовали в ОПЕРАТОРЕ (где у вас есть альтернативы), с тем, что вы сделали в INT (где у вас есть of ...).другими словами, он будет иметь вид A of B | C of D | ....

. Кроме того, вам не нужно INT of int - вы можете просто использовать простой int (то есть целое число) для INT - и яПодозреваю, что ML имеет логический тип, который можно использовать вместо определения типа данных для BOOL (другими словами, вам, вероятно, вообще не нужно определять тип данных ни для одного из них - просто используйте то, что уже присутствует в языке).

ps также нормально добавить тэг "homework" для домашней работы.

[редактировать для OPERATOR у вас есть несколько типов, но это нормально - просто вставьте их в кортеж, как (A,B), чейтип написан a * b.для последовательности выражений используйте список, как для ARGUMENTS.]

...