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 ответ

Решение

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

Неверные объявления% для fundec и fundeclist были неправильными. Я просто опустил токен "of ...", чтобы указать, что fundec / fundeclist действительно имеет значение.

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

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

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

%nonterm fundec  | fundeclist 

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

Другие вопросы по тегам