Ml-yacc 解析问题.. 处理类型 "unit"
Ml-yacc parsing issues.. dealing with type "unit"
首先,这是一个作业。我必须制作一个可以解析此处描述的语言的程序:http://www.cs.princeton.edu/courses/archive/spring12/cos320/resources/fun_language_definition.html
这是 Fun 语言的一个例子:
fun id(x:<int,int>):<int,int> = x
fun main(arg:int):int = id(3)
这应该被解析为:
[((1,1),(id"id",id"x",Tupletp([Inttp,Inttp]),Tupletp([Inttp,Inttp]),Id(id"x"))),
((2,1),(id"main",id"arg",Inttp,Inttp, Call (Id(id"id"),Int 3)))]
我将给出我的部分代码的快照:
prog: fundeclist EOF (fundeclist)
fundeclist: fundec ([fundec])
| fundeclist fundec (fundeclist @ [fundec])
fundec: FUN ID LPAREN ID COLON ftype RPAREN COLON ftype EQ exp
( ((FUNleft, expright), (Symbol.symbol ID1,
Symbol.symbol ID2, A.Inttp, A.Inttp, exp)) ) (* FIXME types *)
exp:
LPAREN exp RPAREN (exp)
| ID (A.Pos((IDleft, IDright),
A.Id (Symbol.symbol(ID)) ))
| INT (A.Pos((INTleft,INTright),
A.Int(INT)))
Exp 将继续用 Fun 语言进行各种可能的表达。我还有一些上半部分,我在其中声明了终端、非终端、关联规则。
现在我遇到的最大问题 运行 是编译我的代码后立即出现的这些 SML 消息:
fun.grm.sml:342.60-346.5 Error: operator and operand don't agree [tycon mismatch]
operator domain: unit -> Absyn.prog
operand: unit -> unit
in expression:
prog (fn _ => let val <binding> in fundeclist end)
fun.grm.sml:362.6-362.27 Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z list * 'Z list
operand: unit * Absyn.fundec list
in expression:
fundeclist @ fundec :: nil
val it = false : bool
我使用非终端的方式有问题吗?这个错误通常在解析时说什么?这个错误是从下到上传播的,所以我一直在尝试用虚拟值进行各种替换以使错误消失 - 直到我到达这里。如何解决这个问题?
我终于找到错误了。 (可能对其他人有用)
fundec 和 fundeclist 的 %nonterm 声明是错误的。我只是省略了标记 "of ..." 来指定 fundec/fundeclist 实际上有一个值。
正确版本:
%nonterm fundec of A.fundec | fundeclist of A.fundec list
我的初始版本:
%nonterm fundec | fundeclist
显然,在这种情况下,fundec 和 fundeclist 的值是一致的。
首先,这是一个作业。我必须制作一个可以解析此处描述的语言的程序:http://www.cs.princeton.edu/courses/archive/spring12/cos320/resources/fun_language_definition.html
这是 Fun 语言的一个例子:
fun id(x:<int,int>):<int,int> = x
fun main(arg:int):int = id(3)
这应该被解析为:
[((1,1),(id"id",id"x",Tupletp([Inttp,Inttp]),Tupletp([Inttp,Inttp]),Id(id"x"))),
((2,1),(id"main",id"arg",Inttp,Inttp, Call (Id(id"id"),Int 3)))]
我将给出我的部分代码的快照:
prog: fundeclist EOF (fundeclist)
fundeclist: fundec ([fundec])
| fundeclist fundec (fundeclist @ [fundec])
fundec: FUN ID LPAREN ID COLON ftype RPAREN COLON ftype EQ exp
( ((FUNleft, expright), (Symbol.symbol ID1,
Symbol.symbol ID2, A.Inttp, A.Inttp, exp)) ) (* FIXME types *)
exp:
LPAREN exp RPAREN (exp)
| ID (A.Pos((IDleft, IDright),
A.Id (Symbol.symbol(ID)) ))
| INT (A.Pos((INTleft,INTright),
A.Int(INT)))
Exp 将继续用 Fun 语言进行各种可能的表达。我还有一些上半部分,我在其中声明了终端、非终端、关联规则。
现在我遇到的最大问题 运行 是编译我的代码后立即出现的这些 SML 消息:
fun.grm.sml:342.60-346.5 Error: operator and operand don't agree [tycon mismatch]
operator domain: unit -> Absyn.prog
operand: unit -> unit
in expression:
prog (fn _ => let val <binding> in fundeclist end)
fun.grm.sml:362.6-362.27 Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z list * 'Z list
operand: unit * Absyn.fundec list
in expression:
fundeclist @ fundec :: nil
val it = false : bool
我使用非终端的方式有问题吗?这个错误通常在解析时说什么?这个错误是从下到上传播的,所以我一直在尝试用虚拟值进行各种替换以使错误消失 - 直到我到达这里。如何解决这个问题?
我终于找到错误了。 (可能对其他人有用)
fundec 和 fundeclist 的 %nonterm 声明是错误的。我只是省略了标记 "of ..." 来指定 fundec/fundeclist 实际上有一个值。
正确版本:
%nonterm fundec of A.fundec | fundeclist of A.fundec list
我的初始版本:
%nonterm fundec | fundeclist
显然,在这种情况下,fundec 和 fundeclist 的值是一致的。