diff options
| author | krasimir <krasimir@chalmers.se> | 2008-04-22 08:33:23 +0000 |
|---|---|---|
| committer | krasimir <krasimir@chalmers.se> | 2008-04-22 08:33:23 +0000 |
| commit | 92917e6e5e17a9c2bee27d33835755516a8b1178 (patch) | |
| tree | 6556633e247b13745ebe14f2d31229bb4ac06aaf /src/GF/Source/ParGF.y | |
| parent | 4c73735de917e2811f1ce75561397dc875365f94 (diff) | |
Use Happy grammar for imports extraction instead of hand made shallow crapy grammar
Diffstat (limited to 'src/GF/Source/ParGF.y')
| -rw-r--r-- | src/GF/Source/ParGF.y | 147 |
1 files changed, 85 insertions, 62 deletions
diff --git a/src/GF/Source/ParGF.y b/src/GF/Source/ParGF.y index 309ef2af3..2109434e5 100644 --- a/src/GF/Source/ParGF.y +++ b/src/GF/Source/ParGF.y @@ -1,7 +1,7 @@ -- This Happy file was machine-generated by the BNF converter { {-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-} - module GF.Source.ParGF (pGrammar, pModDef, pOldGrammar, pExp, myLexer) where --H + module GF.Source.ParGF (pGrammar, pModDef, pOldGrammar, pExp, pModHeader, myLexer) where --H import GF.Source.AbsGF --H import GF.Source.LexGF --H import GF.Infra.Ident --H @@ -12,6 +12,7 @@ import GF.Data.ErrM --H %name pModDef ModDef %name pOldGrammar OldGrammar %name pExp Exp +%partial pModHeader ModHeader -- no lexer declaration %monad { Err } { thenM } { returnM } @@ -38,6 +39,7 @@ import GF.Data.ErrM --H '<' { PT _ (TS "<") } '>' { PT _ (TS ">") } '@' { PT _ (TS "@") } + '#' { PT _ (TS "#") } '!' { PT _ (TS "!") } '*' { PT _ (TS "*") } '+' { PT _ (TS "+") } @@ -94,21 +96,21 @@ import GF.Data.ErrM --H 'where' { PT _ (TS "where") } 'with' { PT _ (TS "with") } -L_ident { PT _ (TV $$) } L_integ { PT _ (TI $$) } L_quoted { PT _ (TL $$) } L_doubl { PT _ (TD $$) } L_LString { PT _ (T_LString $$) } +L_PIdent { PT _ (T_PIdent _) } L_err { _ } %% -Ident :: { Ident } : L_ident { identC $1 } --H Integer :: { Integer } : L_integ { (read $1) :: Integer } String :: { String } : L_quoted { $1 } Double :: { Double } : L_doubl { (read $1) :: Double } LString :: { LString} : L_LString { LString ($1)} +PIdent :: { PIdent} : L_PIdent { PIdent (mkPosToken $1)} Grammar :: { Grammar } Grammar : ListModDef { Gr (reverse $1) } @@ -121,12 +123,12 @@ ListModDef : {- empty -} { [] } ModDef :: { ModDef } ModDef : ModDef ';' { $1 } - | 'grammar' Ident '=' '{' 'abstract' '=' Ident ';' ListConcSpec '}' { MMain $2 $7 $9 } + | 'grammar' PIdent '=' '{' 'abstract' '=' PIdent ';' ListConcSpec '}' { MMain $2 $7 $9 } | ComplMod ModType '=' ModBody { MModule $1 $2 $4 } ConcSpec :: { ConcSpec } -ConcSpec : Ident '=' ConcExp { ConcSpec $1 $3 } +ConcSpec : PIdent '=' ConcExp { ConcSpec $1 $3 } ListConcSpec :: { [ConcSpec] } @@ -136,7 +138,7 @@ ListConcSpec : {- empty -} { [] } ConcExp :: { ConcExp } -ConcExp : Ident ListTransfer { ConcExp $1 (reverse $2) } +ConcExp : PIdent ListTransfer { ConcExp $1 (reverse $2) } ListTransfer :: { [Transfer] } @@ -149,13 +151,28 @@ Transfer : '(' 'transfer' 'in' Open ')' { TransferIn $4 } | '(' 'transfer' 'out' Open ')' { TransferOut $4 } +ModHeader :: { ModDef } +ModHeader : ComplMod ModType '=' ModHeaderBody { MModule $1 $2 $4 } + + +ModHeaderBody :: { ModBody } +ModHeaderBody : Extend Opens { MBody $1 $2 [] } + | ListIncluded { MNoBody $1 } + | Included 'with' ListOpen { MWith $1 $3 } + | Included 'with' ListOpen '**' Opens { MWithBody $1 $3 $5 [] } + | ListIncluded '**' Included 'with' ListOpen { MWithE $1 $3 $5 } + | ListIncluded '**' Included 'with' ListOpen '**' Opens { MWithEBody $1 $3 $5 $7 [] } + | 'reuse' PIdent { MReuse $2 } + | 'union' ListIncluded { MUnion $2 } + + ModType :: { ModType } -ModType : 'abstract' Ident { MTAbstract $2 } - | 'resource' Ident { MTResource $2 } - | 'interface' Ident { MTInterface $2 } - | 'concrete' Ident 'of' Ident { MTConcrete $2 $4 } - | 'instance' Ident 'of' Ident { MTInstance $2 $4 } - | 'transfer' Ident ':' Open '->' Open { MTTransfer $2 $4 $6 } +ModType : 'abstract' PIdent { MTAbstract $2 } + | 'resource' PIdent { MTResource $2 } + | 'interface' PIdent { MTInterface $2 } + | 'concrete' PIdent 'of' PIdent { MTConcrete $2 $4 } + | 'instance' PIdent 'of' PIdent { MTInstance $2 $4 } + | 'transfer' PIdent ':' Open '->' Open { MTTransfer $2 $4 $6 } ModBody :: { ModBody } @@ -165,7 +182,7 @@ ModBody : Extend Opens '{' ListTopDef '}' { MBody $1 $2 (reverse $4) } | Included 'with' ListOpen '**' Opens '{' ListTopDef '}' { MWithBody $1 $3 $5 (reverse $7) } | ListIncluded '**' Included 'with' ListOpen { MWithE $1 $3 $5 } | ListIncluded '**' Included 'with' ListOpen '**' Opens '{' ListTopDef '}' { MWithEBody $1 $3 $5 $7 (reverse $9) } - | 'reuse' Ident { MReuse $2 } + | 'reuse' PIdent { MReuse $2 } | 'union' ListIncluded { MUnion $2 } @@ -191,9 +208,9 @@ Opens : {- empty -} { NoOpens } Open :: { Open } -Open : Ident { OName $1 } - | '(' QualOpen Ident ')' { OQualQO $2 $3 } - | '(' QualOpen Ident '=' Ident ')' { OQual $2 $3 $5 } +Open : PIdent { OName $1 } + | '(' QualOpen PIdent ')' { OQualQO $2 $3 } + | '(' QualOpen PIdent '=' PIdent ')' { OQual $2 $3 $5 } ComplMod :: { ComplMod } @@ -214,9 +231,9 @@ ListIncluded : {- empty -} { [] } Included :: { Included } -Included : Ident { IAll $1 } - | Ident '[' ListIdent ']' { ISome $1 $3 } - | Ident '-' '[' ListIdent ']' { IMinus $1 $4 } +Included : PIdent { IAll $1 } + | PIdent '[' ListPIdent ']' { ISome $1 $3 } + | PIdent '-' '[' ListPIdent ']' { IMinus $1 $4 } Def :: { Def } @@ -244,28 +261,28 @@ TopDef : 'cat' ListCatDef { DefCat $2 } | 'printname' ListPrintDef { DefPrintOld $2 } | 'lintype' ListDef { DefLintype $2 } | 'pattern' ListDef { DefPattern $2 } - | 'package' Ident '=' '{' ListTopDef '}' ';' { DefPackage $2 (reverse $5) } + | 'package' PIdent '=' '{' ListTopDef '}' ';' { DefPackage $2 (reverse $5) } | 'var' ListDef { DefVars $2 } - | 'tokenizer' Ident ';' { DefTokenizer $2 } + | 'tokenizer' PIdent ';' { DefTokenizer $2 } CatDef :: { CatDef } -CatDef : Ident ListDDecl { SimpleCatDef $1 (reverse $2) } - | '[' Ident ListDDecl ']' { ListCatDef $2 (reverse $3) } - | '[' Ident ListDDecl ']' '{' Integer '}' { ListSizeCatDef $2 (reverse $3) $6 } +CatDef : PIdent ListDDecl { SimpleCatDef $1 (reverse $2) } + | '[' PIdent ListDDecl ']' { ListCatDef $2 (reverse $3) } + | '[' PIdent ListDDecl ']' '{' Integer '}' { ListSizeCatDef $2 (reverse $3) $6 } FunDef :: { FunDef } -FunDef : ListIdent ':' Exp { FunDef $1 $3 } +FunDef : ListPIdent ':' Exp { FunDef $1 $3 } DataDef :: { DataDef } -DataDef : Ident '=' ListDataConstr { DataDef $1 $3 } +DataDef : PIdent '=' ListDataConstr { DataDef $1 $3 } DataConstr :: { DataConstr } -DataConstr : Ident { DataId $1 } - | Ident '.' Ident { DataQId $1 $3 } +DataConstr : PIdent { DataId $1 } + | PIdent '.' PIdent { DataQId $1 $3 } ListDataConstr :: { [DataConstr] } @@ -275,13 +292,13 @@ ListDataConstr : {- empty -} { [] } ParDef :: { ParDef } -ParDef : Ident '=' ListParConstr { ParDefDir $1 $3 } - | Ident '=' '(' 'in' Ident ')' { ParDefIndir $1 $5 } - | Ident { ParDefAbs $1 } +ParDef : PIdent '=' ListParConstr { ParDefDir $1 $3 } + | PIdent '=' '(' 'in' PIdent ')' { ParDefIndir $1 $5 } + | PIdent { ParDefAbs $1 } ParConstr :: { ParConstr } -ParConstr : Ident ListDDecl { ParConstr $1 (reverse $2) } +ParConstr : PIdent ListDDecl { ParConstr $1 (reverse $2) } PrintDef :: { PrintDef } @@ -289,7 +306,7 @@ PrintDef : ListName '=' Exp { PrintDef $1 $3 } FlagDef :: { FlagDef } -FlagDef : Ident '=' Ident { FlagDef $1 $3 } +FlagDef : PIdent '=' PIdent { FlagDef $1 $3 } ListDef :: { [Def] } @@ -333,14 +350,14 @@ ListParConstr : {- empty -} { [] } | ParConstr '|' ListParConstr { (:) $1 $3 } -ListIdent :: { [Ident] } -ListIdent : Ident { (:[]) $1 } - | Ident ',' ListIdent { (:) $1 $3 } +ListPIdent :: { [PIdent] } +ListPIdent : PIdent { (:[]) $1 } + | PIdent ',' ListPIdent { (:) $1 $3 } Name :: { Name } -Name : Ident { IdentName $1 } - | '[' Ident ']' { ListName $2 } +Name : PIdent { IdentName $1 } + | '[' PIdent ']' { ListName $2 } ListName :: { [Name] } @@ -349,9 +366,9 @@ ListName : Name { (:[]) $1 } LocDef :: { LocDef } -LocDef : ListIdent ':' Exp { LDDecl $1 $3 } - | ListIdent '=' Exp { LDDef $1 $3 } - | ListIdent ':' Exp '=' Exp { LDFull $1 $3 $5 } +LocDef : ListPIdent ':' Exp { LDDecl $1 $3 } + | ListPIdent '=' Exp { LDDef $1 $3 } + | ListPIdent ':' Exp '=' Exp { LDFull $1 $3 $5 } ListLocDef :: { [LocDef] } @@ -361,9 +378,9 @@ ListLocDef : {- empty -} { [] } Exp6 :: { Exp } -Exp6 : Ident { EIdent $1 } - | '{' Ident '}' { EConstr $2 } - | '%' Ident '%' { ECons $2 } +Exp6 : PIdent { EIdent $1 } + | '{' PIdent '}' { EConstr $2 } + | '%' PIdent '%' { ECons $2 } | Sort { ESort $1 } | String { EString $1 } | Integer { EInt $1 } @@ -371,11 +388,11 @@ Exp6 : Ident { EIdent $1 } | '?' { EMeta } | '[' ']' { EEmpty } | 'data' { EData } - | '[' Ident Exps ']' { EList $2 $3 } + | '[' PIdent Exps ']' { EList $2 $3 } | '[' String ']' { EStrings $2 } | '{' ListLocDef '}' { ERecord $2 } | '<' ListTupleComp '>' { ETuple $2 } - | '(' 'in' Ident ')' { EIndir $3 } + | '(' 'in' PIdent ')' { EIndir $3 } | '<' Exp ':' Exp '>' { ETyped $2 $4 } | '(' Exp ')' { $2 } | LString { ELString $1 } @@ -383,8 +400,8 @@ Exp6 : Ident { EIdent $1 } Exp5 :: { Exp } Exp5 : Exp5 '.' Label { EProj $1 $3 } - | '{' Ident '.' Ident '}' { EQConstr $2 $4 } - | '%' Ident '.' Ident { EQCons $2 $4 } + | '{' PIdent '.' PIdent '}' { EQConstr $2 $4 } + | '%' PIdent '.' PIdent { EQCons $2 $4 } | Exp6 { $1 } @@ -397,9 +414,11 @@ Exp4 : Exp4 Exp5 { EApp $1 $2 } | 'variants' '{' ListExp '}' { EVariants $3 } | 'pre' '{' Exp ';' ListAltern '}' { EPre $3 $5 } | 'strs' '{' ListExp '}' { EStrs $3 } - | Ident '@' Exp6 { EConAt $1 $3 } + | PIdent '@' Exp6 { EConAt $1 $3 } + | '#' Patt2 { EPatt $2 } + | 'pattern' Exp5 { EPattType $2 } | Exp5 { $1 } - | 'Lin' Ident { ELin $2 } + | 'Lin' PIdent { ELin $2 } Exp3 :: { Exp } @@ -444,10 +463,14 @@ Exps : {- empty -} { NilExp } Patt2 :: { Patt } -Patt2 : '_' { PW } - | Ident { PV $1 } - | '{' Ident '}' { PCon $2 } - | Ident '.' Ident { PQ $1 $3 } +Patt2 : '?' { PChar } + | '[' String ']' { PChars $2 } + | '#' PIdent { PMacro $2 } + | '#' PIdent '.' PIdent { PM $2 $4 } + | '_' { PW } + | PIdent { PV $1 } + | '{' PIdent '}' { PCon $2 } + | PIdent '.' PIdent { PQ $1 $3 } | Integer { PInt $1 } | Double { PFloat $1 } | String { PStr $1 } @@ -457,10 +480,10 @@ Patt2 : '_' { PW } Patt1 :: { Patt } -Patt1 : Ident ListPatt { PC $1 $2 } - | Ident '.' Ident ListPatt { PQC $1 $3 $4 } +Patt1 : PIdent ListPatt { PC $1 $2 } + | PIdent '.' PIdent ListPatt { PQC $1 $3 $4 } | Patt2 '*' { PRep $1 } - | Ident '@' Patt2 { PAs $1 $3 } + | PIdent '@' Patt2 { PAs $1 $3 } | '-' Patt2 { PNeg $2 } | Patt2 { $1 } @@ -472,11 +495,11 @@ Patt : Patt '|' Patt1 { PDisj $1 $3 } PattAss :: { PattAss } -PattAss : ListIdent '=' Patt { PA $1 $3 } +PattAss : ListPIdent '=' Patt { PA $1 $3 } Label :: { Label } -Label : Ident { LIdent $1 } +Label : PIdent { LIdent $1 } | '$' Integer { LVar $2 } @@ -500,7 +523,7 @@ ListPatt : Patt2 { (:[]) $1 } Bind :: { Bind } -Bind : Ident { BIdent $1 } +Bind : PIdent { BIdent $1 } | '_' { BWild } @@ -585,11 +608,11 @@ Include : {- empty -} { NoIncl } FileName :: { FileName } FileName : String { FString $1 } - | Ident { FIdent $1 } + | PIdent { FIdent $1 } | '/' FileName { FSlash $2 } | '.' FileName { FDot $2 } | '-' FileName { FMinus $2 } - | Ident FileName { FAddId $1 $2 } + | PIdent FileName { FAddId $1 $2 } ListFileName :: { [FileName] } |
