Parsing SML数据类型

Parsing SML数据类型,parsing,grammar,sml,Parsing,Grammar,Sml,我需要将以下语法转换为SML数据类型: Integer ranges over SML integer constants. Boolean ::= 'true' | 'false' Operator ::= 'ADD' | 'IF' | 'LESS_THAN' Arguments ::= ( ',' Expression ) * Expression ::= 'INT' '(' Integer ')' | 'BOOL' '(' Boolean ')'

我需要将以下语法转换为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;

然而,我正在努力处理数据类型
参数
表达式
。任何帮助都将不胜感激。

对于参数,您可以使用表达式序列,这样类似于表达式列表的东西就可以了(括号需要解析,但您不需要将它们存储在您的类型中,因为它们总是存在的)

对于表达式,您需要将在运算符中使用的方法(您有备选方案)与在INT中使用的方法(您有…)相结合。换句话说,它的形式将是
A的B | C的D |…

此外,您实际上不需要INT的
INT
-您可以使用一个简单的
INT
(即整数)来表示INT-我怀疑ML有一个布尔类型,可以使用它来代替为BOOL定义数据类型(换句话说,您可能根本不需要为其中任何一种定义数据类型——只需使用语言中已有的数据类型即可)

ps为家庭作业添加“家庭作业”标签也是正常的


[edit for OPERATOR您有多种类型,但这没关系-只需将它们放在一个元组中,如
(a,B)
,其类型为
a*B
。对于表达式序列,使用列表,如参数。]

对于参数,您可以使用表达式序列,这样类似表达式列表的东西就可以了(括号需要解析,但不需要将它们存储在类型中,因为它们总是在那里)

对于表达式,您需要将您在运算符中使用的方法(您有备选方案)与在INT中使用的方法(您有
of…
)相结合。换句话说,它的形式是
A of B | C of D |…

此外,您实际上不需要INT的
INT
-您可以使用一个简单的
INT
(即整数)来表示INT-我怀疑ML有一个布尔类型,可以使用它来代替为BOOL定义数据类型(换句话说,您可能根本不需要为其中任何一种定义数据类型——只需使用语言中已有的数据类型即可)

ps为家庭作业添加“家庭作业”标签也是正常的


[为运算符编辑您有多种类型,但这没关系-只需将它们放在一个元组中,如
(a,B)
,其类型为
a*B
。对于表达式的顺序,请使用列表,如参数。]

谢谢您的回答,但我正在努力进行|操作(也就是说,我不太明白如何将操作描述为(运算符,后跟递归表达式):S刚开始学习SML,我发现它相当棘手。我添加了一些。如果您搜索“SML数据类型”你可以找到一堆例子。它非常符合逻辑、简单且一致。而且不用担心递归之类的事情;在列表中粘贴多个值(相同类型的值)以及在元组中粘贴多个不同类型的值。谢谢你的回答,但是我正在努力解决|操作(即,我不太明白如何将操作描述为(运算符,后跟递归表达式):S刚开始学习SML,我发现它相当棘手。我添加了一些。如果你搜索“SML数据类型”,你可以找到一堆示例。它非常符合逻辑、简单且一致。而且不必担心递归之类的事情;在列表中粘贴多个值(相同类型)(以及元组中不同类型的多个值)。