summaryrefslogtreecommitdiff
path: root/src/tools/c/GFCC/Par.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/c/GFCC/Par.y')
-rw-r--r--src/tools/c/GFCC/Par.y204
1 files changed, 204 insertions, 0 deletions
diff --git a/src/tools/c/GFCC/Par.y b/src/tools/c/GFCC/Par.y
new file mode 100644
index 000000000..fa30981cb
--- /dev/null
+++ b/src/tools/c/GFCC/Par.y
@@ -0,0 +1,204 @@
+-- This Happy file was machine-generated by the BNF converter
+{
+{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
+module GFCC.Par where
+import GFCC.Abs
+import GFCC.Lex
+import GFCC.ErrM
+}
+
+%name pGrammar Grammar
+%name pHeader Header
+%name pAbstract Abstract
+%name pConcrete Concrete
+%name pAbsDef AbsDef
+%name pCncDef CncDef
+%name pType Type
+%name pExp Exp
+%name pAtom Atom
+%name pTerm Term
+%name pTokn Tokn
+%name pVariant Variant
+%name pListConcrete ListConcrete
+%name pListAbsDef ListAbsDef
+%name pListCncDef ListCncDef
+%name pListCId ListCId
+%name pListTerm ListTerm
+%name pListExp ListExp
+%name pListString ListString
+%name pListVariant ListVariant
+
+-- no lexer declaration
+%monad { Err } { thenM } { returnM }
+%tokentype { Token }
+
+%token
+ ';' { PT _ (TS ";") }
+ '(' { PT _ (TS "(") }
+ ')' { PT _ (TS ")") }
+ '{' { PT _ (TS "{") }
+ '}' { PT _ (TS "}") }
+ ':' { PT _ (TS ":") }
+ '=' { PT _ (TS "=") }
+ '->' { PT _ (TS "->") }
+ '?' { PT _ (TS "?") }
+ '[' { PT _ (TS "[") }
+ ']' { PT _ (TS "]") }
+ '!' { PT _ (TS "!") }
+ '$' { PT _ (TS "$") }
+ '[|' { PT _ (TS "[|") }
+ '|]' { PT _ (TS "|]") }
+ '+' { PT _ (TS "+") }
+ '@' { PT _ (TS "@") }
+ '#' { PT _ (TS "#") }
+ '/' { PT _ (TS "/") }
+ ',' { PT _ (TS ",") }
+ 'abstract' { PT _ (TS "abstract") }
+ 'concrete' { PT _ (TS "concrete") }
+ 'grammar' { PT _ (TS "grammar") }
+ 'pre' { PT _ (TS "pre") }
+
+L_quoted { PT _ (TL $$) }
+L_integ { PT _ (TI $$) }
+L_doubl { PT _ (TD $$) }
+L_CId { PT _ (T_CId $$) }
+L_err { _ }
+
+
+%%
+
+String :: { String } : L_quoted { $1 }
+Integer :: { Integer } : L_integ { (read $1) :: Integer }
+Double :: { Double } : L_doubl { (read $1) :: Double }
+CId :: { CId} : L_CId { CId ($1)}
+
+Grammar :: { Grammar }
+Grammar : Header ';' Abstract ';' ListConcrete { Grm $1 $3 (reverse $5) }
+
+
+Header :: { Header }
+Header : 'grammar' CId '(' ListCId ')' { Hdr $2 $4 }
+
+
+Abstract :: { Abstract }
+Abstract : 'abstract' '{' ListAbsDef '}' { Abs (reverse $3) }
+
+
+Concrete :: { Concrete }
+Concrete : 'concrete' CId '{' ListCncDef '}' { Cnc $2 (reverse $4) }
+
+
+AbsDef :: { AbsDef }
+AbsDef : CId ':' Type '=' Exp { Fun $1 $3 $5 }
+
+
+CncDef :: { CncDef }
+CncDef : CId '=' Term { Lin $1 $3 }
+
+
+Type :: { Type }
+Type : ListCId '->' CId { Typ $1 $3 }
+
+
+Exp :: { Exp }
+Exp : '(' Atom ListExp ')' { Tr $2 (reverse $3) }
+ | Atom { trA_ $1 }
+
+
+Atom :: { Atom }
+Atom : CId { AC $1 }
+ | String { AS $1 }
+ | Integer { AI $1 }
+ | Double { AF $1 }
+ | '?' { AM }
+
+
+Term :: { Term }
+Term : '[' ListTerm ']' { R $2 }
+ | '(' Term '!' Term ')' { P $2 $4 }
+ | '(' ListTerm ')' { S $2 }
+ | Tokn { K $1 }
+ | '$' Integer { V $2 }
+ | Integer { C $1 }
+ | CId { F $1 }
+ | '[|' ListTerm '|]' { FV $2 }
+ | '(' String '+' Term ')' { W $2 $4 }
+ | '(' Term '@' Term ')' { RP $2 $4 }
+ | '?' { TM }
+ | '(' CId '->' Term ')' { L $2 $4 }
+ | '#' CId { BV $2 }
+
+
+Tokn :: { Tokn }
+Tokn : String { KS $1 }
+ | '[' 'pre' ListString '[' ListVariant ']' ']' { KP (reverse $3) $5 }
+
+
+Variant :: { Variant }
+Variant : ListString '/' ListString { Var (reverse $1) (reverse $3) }
+
+
+ListConcrete :: { [Concrete] }
+ListConcrete : {- empty -} { [] }
+ | ListConcrete Concrete ';' { flip (:) $1 $2 }
+
+
+ListAbsDef :: { [AbsDef] }
+ListAbsDef : {- empty -} { [] }
+ | ListAbsDef AbsDef ';' { flip (:) $1 $2 }
+
+
+ListCncDef :: { [CncDef] }
+ListCncDef : {- empty -} { [] }
+ | ListCncDef CncDef ';' { flip (:) $1 $2 }
+
+
+ListCId :: { [CId] }
+ListCId : {- empty -} { [] }
+ | CId { (:[]) $1 }
+ | CId ',' ListCId { (:) $1 $3 }
+
+
+ListTerm :: { [Term] }
+ListTerm : {- empty -} { [] }
+ | Term { (:[]) $1 }
+ | Term ',' ListTerm { (:) $1 $3 }
+
+
+ListExp :: { [Exp] }
+ListExp : {- empty -} { [] }
+ | ListExp Exp { flip (:) $1 $2 }
+
+
+ListString :: { [String] }
+ListString : {- empty -} { [] }
+ | ListString String { flip (:) $1 $2 }
+
+
+ListVariant :: { [Variant] }
+ListVariant : {- empty -} { [] }
+ | Variant { (:[]) $1 }
+ | Variant ',' ListVariant { (:) $1 $3 }
+
+
+
+{
+
+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
+trA_ a_ = Tr a_ []
+}
+