diff options
Diffstat (limited to 'src-3.0/GF/CFGM/ParCFG.y')
| -rw-r--r-- | src-3.0/GF/CFGM/ParCFG.y | 129 |
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 +} + |
