packages feed

FM-SBLEX-3.0: src/lib/Dict/Par.y

-- This Happy file was machine-generated by the BNF converter
{
{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
module Dict.Par where
import Dict.Abs
import Dict.Lex
import Dict.ErrM
}

%name pDictionary Dictionary
%name pListEntry ListEntry
%name pListArg ListArg
%name pListTerm ListTerm
%name pEntry Entry
%name pTerm Term
%name pArg Arg

-- no lexer declaration
%monad { Err } { thenM } { returnM }
%tokentype { Token }

%token 
 ';' { PT _ (TS ";") }
 ',' { PT _ (TS ",") }
 '{' { PT _ (TS "{") }
 '}' { PT _ (TS "}") }
 '(' { PT _ (TS "(") }
 ')' { PT _ (TS ")") }

L_ident  { PT _ (TV $$) }
L_integ  { PT _ (TI $$) }
L_quoted { PT _ (TL $$) }
L_err    { _ }


%%

Ident   :: { Ident }   : L_ident  { Ident $1 }
Integer :: { Integer } : L_integ  { (read $1) :: Integer }
String  :: { String }  : L_quoted { $1 }

Dictionary :: { Dictionary }
Dictionary : ListEntry { Dict (reverse $1) } 


ListEntry :: { [Entry] }
ListEntry : {- empty -} { [] } 
  | ListEntry Entry ';' { flip (:) $1 $2 }


ListArg :: { [Arg] }
ListArg : {- empty -} { [] } 
  | ListArg Arg { flip (:) $1 $2 }


ListTerm :: { [Term] }
ListTerm : {- empty -} { [] } 
  | Term { (:[]) $1 }
  | Term ',' ListTerm { (:) $1 $3 }


Entry :: { Entry }
Entry : Ident ListArg { E $1 (reverse $2) } 
  | Ident ListArg '{' ListTerm '}' { EA $1 (reverse $2) $4 }


Term :: { Term }
Term : Ident '(' ListTerm ')' { TermC $1 $3 } 
  | Arg { TermA $1 }


Arg :: { Arg }
Arg : Ident { NId $1 } 
  | Integer { NArg $1 }
  | String { NStr $1 }



{

returnM :: a -> Err a
returnM = return

thenM :: Err a -> (a -> Err b) -> Err b
thenM = (>>=)

happyError :: [Token] -> Err a
happyError ts =
  Bad $ "syntax error at " ++ tokenPos ts ++ 
  case ts of
    [] -> []
    [Err _] -> " due to lexer error"
    _ -> " before " ++ unwords (map prToken (take 4 ts))

myLexer = tokens
}