Ml-yacc解析问题..处理类型“单位”

时间:2015-03-27 18:54:58

标签: parsing grammar sml yacc ml-yacc

首先,这是一个功课。我必须制作一个程序,可以解析这里描述的语言: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

我使用非终端的方式有问题吗?在解析时,这个错误通常会说什么?这个错误从下到上传播,所以我一直尝试用虚拟值进行各种替换,以使错误消失 - 直到我到达这里。如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我终于找到了错误。 (可能对其他人有用)

fundec和fundeclist的%nonterm声明是错误的。我只是省略了......&#34;的标记。指定fundec / fundeclist实际上有一个值。

正确版本:

%nonterm fundec of A.fundec | fundeclist of A.fundec list 

我的初始版本:

%nonterm fundec  | fundeclist 

显然,在这种情况下,fundec和fundeclist的价值观就是单位。