2015-03-27 6 views
0

Прежде всего, это домашнее задание. Я должен сделать программу, которая может анализировать язык, описанный здесь: 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 

Является ли это что-то не так в том, как я использую мои нетерминалы? Как обычно эта ошибка возникает при разборе? Эта ошибка распространялась снизу вверх, поэтому я пытался использовать всевозможные замены с фиктивными значениями, чтобы ошибка исчезла - пока я не оказался здесь. Как это исправить?

ответ

1

Я, наконец, нашел ошибку. (может быть полезно для других)

% nonterm деклараций для fundec и fundeclist были неправильными. Я просто пропустил токен «...», чтобы указать, что fundec/fundeclist действительно имеет ценность.

Правильная версия:

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

Моей первоначальная версия:

%nonterm fundec | fundeclist 

Очевидно, fundec и fundeclist в ценности был единицы в этом случае.

Смежные вопросы