Прежде всего, это домашнее задание. Я должен сделать программу, которая может анализировать язык, описанный здесь: http://www.cs.princeton.edu/courses/archive/spring12/cos320/resources/fun_language_definition.htmlПроблемы с анализом Ml-yacc. Работа с типом «единица»
Это является примером 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
Является ли это что-то не так в том, как я использую мои нетерминалы? Как обычно эта ошибка возникает при разборе? Эта ошибка распространялась снизу вверх, поэтому я пытался использовать всевозможные замены с фиктивными значениями, чтобы ошибка исчезла - пока я не оказался здесь. Как это исправить?