summaryrefslogtreecommitdiff
path: root/src-3.0/GF/CFGM/ParCFG.y
diff options
context:
space:
mode:
Diffstat (limited to 'src-3.0/GF/CFGM/ParCFG.y')
-rw-r--r--src-3.0/GF/CFGM/ParCFG.y129
1 files changed, 129 insertions, 0 deletions
diff --git a/src-3.0/GF/CFGM/ParCFG.y b/src-3.0/GF/CFGM/ParCFG.y
new file mode 100644
index 000000000..7b3041b3b
--- /dev/null
+++ b/src-3.0/GF/CFGM/ParCFG.y
@@ -0,0 +1,129 @@
+-- This Happy file was machine-generated by the BNF converter
+{
+module ParCFG where
+import AbsCFG
+import LexCFG
+import ErrM
+}
+
+%name pGrammars Grammars
+
+-- 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 ",") }
+ 'end' { PT _ (TS "end") }
+ 'grammar' { PT _ (TS "grammar") }
+ 'startcat' { PT _ (TS "startcat") }
+
+L_ident { PT _ (TV $$) }
+L_integ { PT _ (TI $$) }
+L_quoted { PT _ (TL $$) }
+L_SingleQuoteString { PT _ (T_SingleQuoteString $$) }
+L_err { _ }
+
+
+%%
+
+Ident :: { Ident } : L_ident { Ident $1 }
+Integer :: { Integer } : L_integ { (read $1) :: Integer }
+String :: { String } : L_quoted { $1 }
+SingleQuoteString :: { SingleQuoteString} : L_SingleQuoteString { SingleQuoteString ($1)}
+
+Grammars :: { Grammars }
+Grammars : ListGrammar { Grammars (reverse $1) }
+
+
+Grammar :: { Grammar }
+Grammar : 'grammar' Ident ListFlag ListRule 'end' 'grammar' { Grammar $2 (reverse $3) (reverse $4) }
+
+
+ListGrammar :: { [Grammar] }
+ListGrammar : {- empty -} { [] }
+ | ListGrammar Grammar { flip (:) $1 $2 }
+
+
+Flag :: { Flag }
+Flag : 'startcat' Category { StartCat $2 }
+
+
+ListFlag :: { [Flag] }
+ListFlag : {- empty -} { [] }
+ | ListFlag Flag ';' { flip (:) $1 $2 }
+
+
+Rule :: { Rule }
+Rule : Fun ':' Profiles '.' Category '->' ListSymbol { Rule $1 $3 $5 $7 }
+
+
+ListRule :: { [Rule] }
+ListRule : {- empty -} { [] }
+ | ListRule Rule ';' { flip (:) $1 $2 }
+
+
+Fun :: { Fun }
+Fun : Ident { Cons $1 }
+ | '_' { Coerce }
+
+
+Profiles :: { Profiles }
+Profiles : '[' ListProfile ']' { Profiles $2 }
+
+
+ListProfile :: { [Profile] }
+ListProfile : {- empty -} { [] }
+ | Profile { (:[]) $1 }
+ | Profile ',' ListProfile { (:) $1 $3 }
+
+
+Profile :: { Profile }
+Profile : '[' ListInteger ']' { UnifyProfile $2 }
+ | Ident { ConstProfile $1 }
+
+
+ListInteger :: { [Integer] }
+ListInteger : {- empty -} { [] }
+ | Integer { (:[]) $1 }
+ | Integer ',' ListInteger { (:) $1 $3 }
+
+
+Symbol :: { Symbol }
+Symbol : Category { CatS $1 }
+ | String { TermS $1 }
+
+
+ListSymbol :: { [Symbol] }
+ListSymbol : '.' { [] }
+ | Symbol { (:[]) $1 }
+ | Symbol ListSymbol { (:) $1 $2 }
+
+
+Category :: { Category }
+Category : SingleQuoteString { Category $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 ++ if null ts then [] else (" before " ++ unwords (map prToken (take 4 ts)))
+
+myLexer = tokens
+}
+