Hello world
This commit is contained in:
commit
e6fdf8060d
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
*.bak
|
||||
/src/Language/Lang/TestGrammer
|
||||
src/**/*.hi
|
||||
src/**/*.o
|
13
Makefile
Normal file
13
Makefile
Normal file
|
@ -0,0 +1,13 @@
|
|||
src/Makefile: grammer.cf
|
||||
bnfc $< -p Language.Lang -o src -m
|
||||
|
||||
src/Language/Lang/TestGrammer: ./src/Makefile
|
||||
cd src && make all
|
||||
|
||||
.PHONY: install parse
|
||||
|
||||
install: src/Language/Lang/TestGrammer
|
||||
install $< ~/.local/bin/lang-parse
|
||||
|
||||
parse: install
|
||||
lang-parse lang/small.lang
|
17
backlog.org
Normal file
17
backlog.org
Normal file
|
@ -0,0 +1,17 @@
|
|||
* Indentation-aware parser
|
||||
Figure out if `bnfc` can support the idea about block-scoping
|
||||
according to non-decreasing indentation levels. Examples:
|
||||
|
||||
-- This is a
|
||||
comment.
|
||||
|
||||
id
|
||||
= x
|
||||
-> x
|
||||
|
||||
id 2
|
||||
|
||||
Here the "--" in column 0 starts a comment block which ends the next
|
||||
time we write something in column <= 0. Which we do in column 4.
|
||||
Similarly the binding that starts at row 4 (with the introduction of
|
||||
an identifier) ends in row 8.
|
244
grammer.cf
Normal file
244
grammer.cf
Normal file
|
@ -0,0 +1,244 @@
|
|||
-- programs
|
||||
|
||||
entrypoints Module;
|
||||
|
||||
Module . Module ::= [Binding] ;
|
||||
|
||||
BindingDeclaration . Binding ::= Declaration;
|
||||
|
||||
BindingDefinition . Binding ::= Definition;
|
||||
|
||||
BindingPragma . Binding ::= "{#" Pragma "#}";
|
||||
|
||||
-- BindingComment . Binding ::= Comment;
|
||||
|
||||
DeclarationNamed . Declaration ::= Name ":" Type;
|
||||
|
||||
DeclarationAnonymous . Declaration ::= Type;
|
||||
|
||||
DefinitionNamed . Definition ::= Name "=" Expression;
|
||||
|
||||
DefinitionAnonymous . Definition ::= Expression;
|
||||
|
||||
TypeName . Type ::= Name;
|
||||
|
||||
TypeApplication . Type ::= Type Type;
|
||||
|
||||
TypeAbstraction . Type ::= Type "->" Type;
|
||||
|
||||
TypeImplicit . Type ::= "{{" [Declaration] "}}";
|
||||
|
||||
TypeRecord . Type ::= "{" [Declaration] "}";
|
||||
|
||||
TypeAlternative . Type ::= "[" [Declaration] "]";
|
||||
|
||||
TypeParens . Type ::= "(" Type ")";
|
||||
|
||||
-- TODO: Do I want wildcards to be stored separately in the AST from
|
||||
-- non-wildcards? Wilcards are identifiers that start with a
|
||||
-- lower-case letter.
|
||||
token Name ((letter | '_' | '\'') (letter | digit | '.' | '-' | '_' | '\'')*);
|
||||
|
||||
-- Perhaps not the best rule. Pragmas are basically comments, but I
|
||||
-- *do* want them to appear in the AST.
|
||||
Pragma . Pragma ::= [ Name ];
|
||||
|
||||
-- TODO: We are using separators because we cannot simply use newlines
|
||||
-- as separators because it would disallow breaking up bindings across
|
||||
-- multiple lines. What we really want is some sort of non-increasing
|
||||
-- indentation level support. So that can correctly parse e.g.:
|
||||
-- id
|
||||
-- = x
|
||||
-- -> x
|
||||
separator Binding ",";
|
||||
|
||||
separator Declaration ",";
|
||||
|
||||
separator Definition ",";
|
||||
|
||||
separator nonempty Type ",";
|
||||
|
||||
separator nonempty Name " ";
|
||||
|
||||
-- TODO: Does not support my idea of `--` marking the beginning of a
|
||||
-- comment *block* which is terminated when the level of indentation
|
||||
-- matches the comment start marker.
|
||||
-- Comment . Comment ::= "--" [Name];
|
||||
|
||||
-- layout "--";
|
||||
|
||||
-- layout "->";
|
||||
|
||||
comment "--";
|
||||
|
||||
comment "{-" "-}";
|
||||
|
||||
-- Only difference from types is that expression do not contain
|
||||
-- declarations but only definition
|
||||
ExpressionName . Expression ::= Name;
|
||||
|
||||
ExpressionLiteral . Expression ::= NumericLiteral;
|
||||
|
||||
ExpressionApplication . Expression ::= Expression Expression;
|
||||
|
||||
ExpressionAbstraction . Expression ::= Expression "->" Expression;
|
||||
|
||||
ExpressionImplicit . Expression ::= "{{" Module "}}";
|
||||
|
||||
ExpressionRecord . Expression ::= "{" Module "}";
|
||||
|
||||
ExpressionAlternative . Expression ::= "[" Module "]";
|
||||
|
||||
ExpressionParens . Expression ::= "(" Expression ")";
|
||||
|
||||
token NumericLiteral ((digit+ '.'? digit*) | (digit* '.'? digit+) ('e' digit+)?)
|
||||
|
||||
-- -- programs ------------------------------------------------
|
||||
|
||||
-- entrypoints Prog ;
|
||||
|
||||
-- Program. Prog ::= [TopDef] ;
|
||||
|
||||
-- FnDef. TopDef ::= Type Ident "(" [Arg] ")" Blk ;
|
||||
|
||||
-- separator nonempty TopDef "" ;
|
||||
|
||||
-- Argument. Arg ::= Type Ident;
|
||||
|
||||
-- separator Arg "," ;
|
||||
|
||||
-- -- statements ----------------------------------------------
|
||||
|
||||
-- Block. Blk ::= "{" [Stmt] "}" ;
|
||||
|
||||
-- separator Stmt "" ;
|
||||
|
||||
-- Empty. Stmt ::= ";" ;
|
||||
|
||||
-- BStmt. Stmt ::= Blk ;
|
||||
|
||||
-- Decl. Stmt ::= Type [Item] ";" ;
|
||||
|
||||
-- NoInit. Item ::= Ident ;
|
||||
|
||||
-- Init. Item ::= Ident "=" Expr ;
|
||||
|
||||
-- InitObj. Item ::= Ident "=" "new" Constructor ;
|
||||
|
||||
-- separator nonempty Item "," ;
|
||||
|
||||
-- Ass. Stmt ::= Expr5 "=" Expr ";" ;
|
||||
|
||||
-- Incr. Stmt ::= Ident "++" ";" ;
|
||||
|
||||
-- Decr. Stmt ::= Ident "--" ";" ;
|
||||
|
||||
-- Ret. Stmt ::= "return" Expr ";" ;
|
||||
|
||||
-- VRet. Stmt ::= "return" ";" ;
|
||||
|
||||
-- Cond. Stmt ::= "if" "(" Expr ")" Stmt ;
|
||||
|
||||
-- CondElse. Stmt ::= "if" "(" Expr ")" Stmt "else" Stmt ;
|
||||
|
||||
-- While. Stmt ::= "while" "(" Expr ")" Stmt ;
|
||||
|
||||
-- For. Stmt ::= "for" "(" Type Ident ":" Expr ")" Stmt ;
|
||||
|
||||
-- SExp. Stmt ::= Expr ";" ;
|
||||
|
||||
-- TypeCon. Constructor ::= Type ;
|
||||
|
||||
-- ArrayCon. Constructor ::= Constructor "[" Expr "]" ;
|
||||
|
||||
-- Indx. Index ::= "[" Expr "]" ;
|
||||
|
||||
-- -- Types ---------------------------------------------------
|
||||
|
||||
-- Int. Type ::= "int" ;
|
||||
|
||||
-- Doub. Type ::= "double" ;
|
||||
|
||||
-- Bool. Type ::= "boolean" ;
|
||||
|
||||
-- Void. Type ::= "void" ;
|
||||
|
||||
-- Array. Type ::= Type "[]" ;
|
||||
|
||||
-- internal String. Type ::= "string" ;
|
||||
|
||||
-- internal Fun. Type ::= Type "(" [Type] ")" ;
|
||||
|
||||
-- separator Type "," ;
|
||||
|
||||
-- -- Expressions ---------------------------------------------
|
||||
|
||||
-- EVar. Expr6 ::= Ident ;
|
||||
|
||||
-- ELitInt. Expr6 ::= Integer ;
|
||||
|
||||
-- ELitDoub. Expr6 ::= Double;
|
||||
|
||||
-- ELitTrue. Expr6 ::= "true" ;
|
||||
|
||||
-- ELitFalse. Expr6 ::= "false" ;
|
||||
|
||||
-- EApp. Expr6 ::= Ident "(" [Expr] ")" ;
|
||||
|
||||
-- EString. Expr6 ::= String ;
|
||||
|
||||
-- Dot. Expr6 ::= Expr6 "." Ident ;
|
||||
|
||||
-- EIndex. Expr6 ::= Expr6 Index;
|
||||
|
||||
-- Neg. Expr5 ::= "-" Expr6 ;
|
||||
|
||||
-- Not. Expr5 ::= "!" Expr6 ;
|
||||
|
||||
-- EMul. Expr4 ::= Expr4 MulOp Expr5 ;
|
||||
|
||||
-- EAdd. Expr3 ::= Expr3 AddOp Expr4 ;
|
||||
|
||||
-- ERel. Expr2 ::= Expr2 RelOp Expr3 ;
|
||||
|
||||
-- EAnd. Expr1 ::= Expr2 "&&" Expr1 ;
|
||||
|
||||
-- EOr. Expr ::= Expr1 "||" Expr ;
|
||||
|
||||
-- internal EAnn. Expr ::= "{-" Type "-}" Expr ;
|
||||
|
||||
-- coercions Expr 6 ;
|
||||
|
||||
-- separator Expr "," ;
|
||||
|
||||
-- -- operators -----------------------------------------------
|
||||
|
||||
-- Plus. AddOp ::= "+" ;
|
||||
|
||||
-- Minus. AddOp ::= "-" ;
|
||||
|
||||
-- Times. MulOp ::= "*" ;
|
||||
|
||||
-- Div. MulOp ::= "/" ;
|
||||
|
||||
-- Mod. MulOp ::= "%" ;
|
||||
|
||||
-- LTH. RelOp ::= "<" ;
|
||||
|
||||
-- LE. RelOp ::= "<=" ;
|
||||
|
||||
-- GTH. RelOp ::= ">" ;
|
||||
|
||||
-- GE. RelOp ::= ">=" ;
|
||||
|
||||
-- EQU. RelOp ::= "==" ;
|
||||
|
||||
-- NE. RelOp ::= "!=" ;
|
||||
|
||||
-- -- comments ------------------------------------------------
|
||||
|
||||
-- comment "#" ;
|
||||
|
||||
-- comment "//" ;
|
||||
|
||||
-- comment "/*" "*/" ;
|
2
lang/ambig.lang
Normal file
2
lang/ambig.lang
Normal file
|
@ -0,0 +1,2 @@
|
|||
_ : { _ : {} },
|
||||
_ = { _ : {} },
|
164
lang/example.lang
Normal file
164
lang/example.lang
Normal file
|
@ -0,0 +1,164 @@
|
|||
-- The empty type is the empty alternative.
|
||||
Bot : Type
|
||||
Bot = []
|
||||
|
||||
-- The unit type is the empty record.
|
||||
Top : Type
|
||||
Top = {}
|
||||
|
||||
t : Top
|
||||
-- Names of literals can be inferred.
|
||||
t = {} @Top
|
||||
t = {}
|
||||
|
||||
Cop : Type
|
||||
Cop = {}
|
||||
|
||||
c : Cop
|
||||
c = {}
|
||||
|
||||
-- Renaming
|
||||
c : Cop
|
||||
c = t @Top
|
||||
|
||||
-- Dropping names
|
||||
k : {}
|
||||
k : t @_
|
||||
|
||||
{} : {}
|
||||
|
||||
Bool : Type
|
||||
Bool = [ false , true ]
|
||||
|
||||
f : Bool
|
||||
f = false
|
||||
|
||||
t : Bool
|
||||
t = true
|
||||
|
||||
-- data Maybe a = Nothing | Just a
|
||||
-- data Maybe : Type -> Type where
|
||||
-- Nothing : Maybe a
|
||||
-- Just : a -> Maybe a
|
||||
|
||||
Maybe : Type -> Type
|
||||
-- Types can be omitted when they can be inferred:
|
||||
Maybe A = [ nothing : Maybe A , just A : Maybe A ]
|
||||
Maybe A = [ nothing , just A ]
|
||||
|
||||
n : Maybe A
|
||||
n = nothing
|
||||
|
||||
j : Maybe Top
|
||||
j = just {}
|
||||
|
||||
Either : Type -> Type -> Type
|
||||
Either A B = [ left A , right B ]
|
||||
|
||||
Nat : Type
|
||||
Nat = [ zero : Nat , succ : Nat -> Nat ]
|
||||
|
||||
two : Nat
|
||||
two = succ (succ zero)
|
||||
|
||||
Pair : Type -> Type -> Type
|
||||
Pair A B { fst : A , snd : B }
|
||||
-- Without naming the projections
|
||||
Pair A B = { A , B }
|
||||
|
||||
p : Pair A B
|
||||
p = { }
|
||||
|
||||
add : N -> N -> N
|
||||
add n m {
|
||||
n + m
|
||||
}
|
||||
|
||||
mult : N -> N -> N
|
||||
mult n m {
|
||||
n * m
|
||||
}
|
||||
|
||||
-- Modules are regular records. This is similar to how records work
|
||||
-- in Agda. In other words, this module (record) contains two
|
||||
-- elements. The elements of the record are themself functions that
|
||||
-- can be exposed by "opening" Bin
|
||||
|
||||
Arith : Type
|
||||
Arith = {
|
||||
add :
|
||||
}
|
||||
|
||||
Bin : N -> N -> Type
|
||||
Bin n m =
|
||||
add : N
|
||||
add = n + m,
|
||||
|
||||
mult : N
|
||||
mult = n * m
|
||||
}
|
||||
|
||||
{} : {}
|
||||
[] : []
|
||||
|
||||
|
||||
|
||||
-- {} is used to *introduce* records/products
|
||||
-- pair.fst is used to eleminate records/producs
|
||||
|
||||
pr : Pair Top Cop
|
||||
pr = { {}, {} }
|
||||
pr = { fst = {}, snd = {} }
|
||||
|
||||
fst : Pair A B -> A
|
||||
fst { fst } = fst
|
||||
|
||||
-- [] is used to eliminate alternatives/sums
|
||||
either : (a -> c) -> (b -> c) -> Either a b -> c
|
||||
either l r e = [ left a = l a, right b = r b ] e
|
||||
-- Syntax for case-statements makes -XLambdaCase redundant.
|
||||
either l r = [ left a = l a, right b = r b ]
|
||||
-- Tags could in theory be omitted just like they can for {}-intro:
|
||||
either l r = [ l, r ]
|
||||
-- Perhaps the meaning will be rather difficult to decipher though,
|
||||
also it would mean that the order in which summands are defined
|
||||
become significant which might not be desirable
|
||||
|
||||
-- Note the duality:
|
||||
{ fst = {}, snd = {} } is an introduction.
|
||||
[ left a = l a, right b = r b ] is an elimination.
|
||||
|
||||
|
||||
-- Comments could follow the non-decreasing indentation rule as well.
|
||||
So that multi-line comments can use the same syntax as single-line
|
||||
comments. Just that the comments on following lines must be
|
||||
indented more than where the comment marker is located. In this
|
||||
example the comment marker is at column 0.
|
||||
|
||||
Semigroup : Type -> Class
|
||||
semigroup a = {
|
||||
append : a -> a -> a
|
||||
}
|
||||
|
||||
Monoid : Type -> Class
|
||||
Monoid a = {
|
||||
{_ Semigroup a _}, -- Curly braces in type signature signal implicit
|
||||
arguments.
|
||||
-- Could also be written:
|
||||
{_ semigroup : Semigroup a _} -- I.e. the braces extend around the
|
||||
field name as well.
|
||||
empty : a
|
||||
}
|
||||
|
||||
Functor : (Type -> Type) -> Class
|
||||
Functor f = {
|
||||
map : (a -> b) -> f a -> f b
|
||||
}
|
||||
|
||||
{ empty = Nothing } : {Semigroup a} -> Monoid (Maybe a)
|
||||
{ Nothing } : {Semigroup a} -> Monoid (Maybe a)
|
||||
|
||||
@{T} : [| T |] -> T
|
||||
@[T] : T -> [| T |]
|
||||
|
||||
T@
|
177
lang/prim.lang
Normal file
177
lang/prim.lang
Normal file
|
@ -0,0 +1,177 @@
|
|||
{# type Type #}
|
||||
|
||||
{# class Class #}
|
||||
|
||||
-- Classes
|
||||
|
||||
Semigroup : Type -> Class
|
||||
Semigroup a = {{
|
||||
append : a -> a -> a
|
||||
}}
|
||||
|
||||
Monoid : Type -> Class
|
||||
Monoid a = {{
|
||||
semigroup : {{ Semigroup a }}
|
||||
empty : a
|
||||
}}
|
||||
|
||||
-- Types
|
||||
|
||||
Void : Type
|
||||
Void = {
|
||||
Void : Type
|
||||
Void = []
|
||||
|
||||
semigroup : {{ Semigroup Void }}
|
||||
semigroup = {{
|
||||
append = []
|
||||
}}
|
||||
}
|
||||
|
||||
Unit : Type
|
||||
Unit = {
|
||||
Unit : Type
|
||||
Unit = {}
|
||||
|
||||
semigroup : {{ Semigroup Unit }}
|
||||
semigroup = {{
|
||||
append _ _ = {}
|
||||
}}
|
||||
|
||||
monoid : {{ Monoid Unit }}
|
||||
monoid = {{
|
||||
empty = {}
|
||||
}}
|
||||
}
|
||||
|
||||
{# prim bool Bool #}
|
||||
Bool : Type
|
||||
Bool = {
|
||||
Bool : Type
|
||||
Bool = [false : {}, true : {}]
|
||||
|
||||
Any : Type
|
||||
Any = {
|
||||
semigroup : {{ Semigroup Bool }}
|
||||
semigroup = {{
|
||||
append a = [false = a, true = true]
|
||||
}}
|
||||
|
||||
monoid : {{ Monoid Bool }}
|
||||
monoid = {{ empty = false }}
|
||||
}
|
||||
|
||||
All : Type
|
||||
All = {
|
||||
semigroup : {{ Semigroup Bool }}
|
||||
semigroup = {{
|
||||
append a = [false = false, true = a]
|
||||
}}
|
||||
|
||||
monoid : {{ Monoid Bool }}
|
||||
monoid = {{ empty = true }}
|
||||
}
|
||||
}
|
||||
|
||||
Int : Type
|
||||
Int = {
|
||||
{# prim i64 Int #}
|
||||
Int : Type
|
||||
Int = [zero : {}, succ : Nat ]
|
||||
|
||||
Additive : Type
|
||||
Additive = {
|
||||
semigroup : {{ Semigroup Int }}
|
||||
semigroup = {{
|
||||
append n = [zero = n, succ m = succ (append n m) ]
|
||||
}}
|
||||
|
||||
monoid : {{ Monoid Int }}
|
||||
monoid = {{
|
||||
empty = zero
|
||||
}}
|
||||
}
|
||||
|
||||
Multiplicative : Type
|
||||
Multiplicative = {
|
||||
semigroup : {{ Semigroup Int }}
|
||||
semigroup = {{
|
||||
append n = [zero = zero, succ m = Additive.append n (append n m) ]
|
||||
}}
|
||||
|
||||
monoid : {{ Monoid Int }}
|
||||
monoid = {{
|
||||
empty = succ zero
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
Pair : Type
|
||||
Pair = {
|
||||
Pair : Type -> Type -> Type
|
||||
Pair a b = { left : a, right : b }
|
||||
|
||||
semigroup : {{ Semigroup A }} -> {{ Semigroup B }} -> {{ Semigroup (Pair A B) }}
|
||||
semigroup = {{
|
||||
append { a0, b0 } { a1, b1 } = { append a0 a1, append b0 b1 }
|
||||
}}
|
||||
|
||||
monoid : {{ Monoid A }} -> {{ Monoid B }} -> {{ Monoid (Pair A B) }}
|
||||
monoid = {{
|
||||
empty = { empty, empty }
|
||||
}}
|
||||
}
|
||||
|
||||
Either : Type
|
||||
Either = {
|
||||
Either : Type -> Type -> Type
|
||||
Either a b = [ left : a, right : b ]
|
||||
|
||||
Left : Type
|
||||
Left = {
|
||||
semigroup : {{ Semigroup (Either A B) }}
|
||||
semigroup = {{
|
||||
append = (l _ = l)
|
||||
}}
|
||||
}
|
||||
|
||||
Right : Type
|
||||
Right = {
|
||||
semigroup : {{ Semigroup (Either A B) }}
|
||||
semigroup = {{
|
||||
append = (_ r = r)
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
List : Type
|
||||
List = {
|
||||
List : Type -> Type
|
||||
List a = [ nil : {} , cons : { head : A , tail : List a } ]
|
||||
|
||||
semigroup : {{ Semigroup (List a) }}
|
||||
semigroup = {{
|
||||
append = [
|
||||
nil b = b
|
||||
(cons a as) b = cons a (append as b)
|
||||
]
|
||||
}}
|
||||
|
||||
monoid : {{ Monoid (List a) }}
|
||||
monoid = {{
|
||||
empty = nil
|
||||
}}
|
||||
}
|
||||
|
||||
{# prim char Char #}
|
||||
Char : Type
|
||||
|
||||
{# prim string String #}
|
||||
String : Type
|
||||
String = List Char
|
||||
|
||||
{# builtin show Show #}
|
||||
Show : Type -> Class
|
||||
Show a = {{
|
||||
show : a -> String
|
||||
}}
|
1
lang/rec.lang
Normal file
1
lang/rec.lang
Normal file
|
@ -0,0 +1 @@
|
|||
Void = {a : a}
|
179
lang/small.lang
Normal file
179
lang/small.lang
Normal file
|
@ -0,0 +1,179 @@
|
|||
{# type Type #} ,
|
||||
|
||||
{# class Class #} ,
|
||||
|
||||
-- Classes
|
||||
|
||||
Semigroup : Type -> Class,
|
||||
Semigroup = a -> {{
|
||||
append : a -> a -> a
|
||||
}},
|
||||
|
||||
Monoid : Type -> Class,
|
||||
Monoid = a -> {{
|
||||
semigroup : {{ Semigroup a }},
|
||||
empty : a
|
||||
}},
|
||||
|
||||
-- Types
|
||||
|
||||
Void : Type,
|
||||
Void = {
|
||||
Void : Type,
|
||||
Void = a,
|
||||
|
||||
semigroup : {{ Semigroup Void }},
|
||||
semigroup = {{
|
||||
append = []
|
||||
}},
|
||||
},
|
||||
|
||||
Unit : Type,
|
||||
Unit = {
|
||||
Unit : Type,
|
||||
Unit = {},
|
||||
|
||||
semigroup : {{ Semigroup Unit }},
|
||||
semigroup = {{
|
||||
append = _ _ -> {},
|
||||
}},
|
||||
|
||||
monoid : {{ Monoid Unit }},
|
||||
monoid = {{
|
||||
empty = {},
|
||||
}},
|
||||
},
|
||||
|
||||
|
||||
{# prim bool Bool #},
|
||||
Bool : Type,
|
||||
Bool = {
|
||||
Bool : Type,
|
||||
Bool = [false : {}, true : {}],
|
||||
|
||||
Any : Type,
|
||||
Any = {
|
||||
semigroup : {{ Semigroup Bool }},
|
||||
semigroup = {{
|
||||
append = a -> [false = a, true = true],
|
||||
}},
|
||||
|
||||
monoid : {{ Monoid Bool }},
|
||||
monoid = {{ empty = false }},
|
||||
},
|
||||
|
||||
All : Type,
|
||||
All = {
|
||||
semigroup : {{ Semigroup Bool }},
|
||||
semigroup = {{
|
||||
append = a -> [false = false, true = a],
|
||||
}},
|
||||
|
||||
monoid : {{ Monoid Bool }},
|
||||
monoid = {{ empty = true }},
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
Int : Type,
|
||||
Int = {
|
||||
{# prim i64 Int #},
|
||||
Int : Type,
|
||||
Int = [zero : {}, succ : Nat ],
|
||||
|
||||
Additive : Type,
|
||||
Additive = {
|
||||
semigroup : {{ Semigroup Int }},
|
||||
semigroup = {{
|
||||
append = n -> [zero = n, succ = m -> succ (append n m) ],
|
||||
}},
|
||||
|
||||
monoid : {{ Monoid Int }},
|
||||
monoid = {{
|
||||
empty = zero,
|
||||
}},
|
||||
},
|
||||
|
||||
Multiplicative : Type,
|
||||
Multiplicative = {
|
||||
semigroup : {{ Semigroup Int }},
|
||||
semigroup = {{
|
||||
append = n -> [zero = zero, succ = m -> Additive.append n (append n m) ],
|
||||
}},
|
||||
|
||||
monoid : {{ Monoid Int }},
|
||||
monoid = {{
|
||||
empty = succ zero,
|
||||
}},
|
||||
},
|
||||
},
|
||||
|
||||
Pair : Type,
|
||||
Pair = {
|
||||
Pair : Type -> Type -> Type,
|
||||
Pair = a -> b -> { left : a, right : b },
|
||||
|
||||
semigroup : {{ Semigroup A }} -> {{ Semigroup B }} -> {{ Semigroup (Pair A B) }},
|
||||
semigroup = {{
|
||||
append = { a0, b0 } { a1, b1 } -> { append a0 a1, append b0 b1 }
|
||||
}},
|
||||
|
||||
monoid : {{ Monoid A }} -> {{ Monoid B }} -> {{ Monoid (Pair A B) }},
|
||||
monoid = {{
|
||||
empty = { empty, empty },
|
||||
}},
|
||||
},
|
||||
|
||||
Either : Type,
|
||||
Either = {
|
||||
Either : Type -> Type -> Type,
|
||||
Either = a b -> [ left : a, right : b ],
|
||||
|
||||
Left : Type,
|
||||
Left = {
|
||||
semigroup : {{ Semigroup (Either A B) }},
|
||||
semigroup = {{
|
||||
append = l _ -> l,
|
||||
}},
|
||||
},
|
||||
|
||||
Right : Type,
|
||||
Right = {
|
||||
semigroup : {{ Semigroup (Either A B) }},
|
||||
semigroup = {{
|
||||
append = _ r -> r
|
||||
}},
|
||||
},
|
||||
},
|
||||
|
||||
List : Type,
|
||||
List = {
|
||||
List : Type -> Type,
|
||||
List = a -> [ nil : {} , cons : { head : A , tail : List a } ],
|
||||
|
||||
semigroup : {{ Semigroup (List a) }},
|
||||
semigroup = {{
|
||||
append = [
|
||||
nil = {} -> b -> b,
|
||||
cons = {a, as} -> b -> cons a (append as b),
|
||||
],
|
||||
}},
|
||||
|
||||
monoid : {{ Monoid (List a) }},
|
||||
monoid = {{
|
||||
empty = nil,
|
||||
}},
|
||||
},
|
||||
|
||||
{# prim char Char #},
|
||||
Char : Type,
|
||||
|
||||
{# prim string String #},
|
||||
String : Type,
|
||||
String = List Char,
|
||||
|
||||
{# builtin show Show #},
|
||||
Show : Type -> Class,
|
||||
Show = a -> {{
|
||||
show : a -> String,
|
||||
}},
|
58
src/Language/Lang/AbsGrammer.hs
Normal file
58
src/Language/Lang/AbsGrammer.hs
Normal file
|
@ -0,0 +1,58 @@
|
|||
-- Haskell data types for the abstract syntax.
|
||||
-- Generated by the BNF converter.
|
||||
|
||||
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
||||
|
||||
module Language.Lang.AbsGrammer where
|
||||
|
||||
import Prelude (Char, Double, Integer, String)
|
||||
import qualified Prelude as C (Eq, Ord, Show, Read)
|
||||
import qualified Data.String
|
||||
|
||||
newtype Name = Name String
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString)
|
||||
|
||||
newtype NumericLiteral = NumericLiteral String
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString)
|
||||
|
||||
data Module = Module [Binding]
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read)
|
||||
|
||||
data Binding
|
||||
= BindingDeclaration Declaration
|
||||
| BindingDefinition Definition
|
||||
| BindingPragma Pragma
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read)
|
||||
|
||||
data Declaration
|
||||
= DeclarationNamed Name Type | DeclarationAnonymous Type
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read)
|
||||
|
||||
data Definition
|
||||
= DefinitionNamed Name Expression | DefinitionAnonymous Expression
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read)
|
||||
|
||||
data Type
|
||||
= TypeName Name
|
||||
| TypeApplication Type Type
|
||||
| TypeAbstraction Type Type
|
||||
| TypeImplicit [Declaration]
|
||||
| TypeRecord [Declaration]
|
||||
| TypeAlternative [Declaration]
|
||||
| TypeParens Type
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read)
|
||||
|
||||
data Pragma = Pragma [Name]
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read)
|
||||
|
||||
data Expression
|
||||
= ExpressionName Name
|
||||
| ExpressionLiteral NumericLiteral
|
||||
| ExpressionApplication Expression Expression
|
||||
| ExpressionAbstraction Expression Expression
|
||||
| ExpressionImplicit Module
|
||||
| ExpressionRecord Module
|
||||
| ExpressionAlternative Module
|
||||
| ExpressionParens Expression
|
||||
deriving (C.Eq, C.Ord, C.Show, C.Read)
|
||||
|
85
src/Language/Lang/DocGrammer.txt
Normal file
85
src/Language/Lang/DocGrammer.txt
Normal file
|
@ -0,0 +1,85 @@
|
|||
The Language grammer
|
||||
BNF Converter
|
||||
|
||||
|
||||
%This txt2tags file is machine-generated by the BNF-converter
|
||||
%Process by txt2tags to generate html or latex
|
||||
|
||||
|
||||
|
||||
This document was automatically generated by the //BNF-Converter//. It was generated together with the lexer, the parser, and the abstract syntax module, which guarantees that the document matches with the implementation of the language (provided no hand-hacking has taken place).
|
||||
|
||||
==The lexical structure of grammer==
|
||||
|
||||
===Literals===
|
||||
|
||||
|
||||
|
||||
Name literals are recognized by the regular expression
|
||||
`````(["'_"] | letter) (["'-._"] | digit | letter)*`````
|
||||
|
||||
NumericLiteral literals are recognized by the regular expression
|
||||
`````digit+ '.'? digit* | digit* '.'? digit+ ('e' digit+)?`````
|
||||
|
||||
|
||||
===Reserved words and symbols===
|
||||
The set of reserved words is the set of terminals appearing in the grammar. Those reserved words that consist of non-letter characters are called symbols, and they are treated in a different way from those that are similar to identifiers. The lexer follows rules familiar from languages like Haskell, C, and Java, including longest match and spacing conventions.
|
||||
|
||||
The reserved words used in grammer are the following:
|
||||
|
||||
There are no reserved words in grammer.
|
||||
|
||||
The symbols used in grammer are the following:
|
||||
| {# | #} | : | =
|
||||
| -> | {{ | }} | {
|
||||
| } | [ | ] | (
|
||||
| ) | , | |
|
||||
|
||||
===Comments===
|
||||
Single-line comments begin with --.Multiple-line comments are enclosed with {- and -}.
|
||||
|
||||
==The syntactic structure of grammer==
|
||||
Non-terminals are enclosed between < and >.
|
||||
The symbols -> (production), **|** (union)
|
||||
and **eps** (empty rule) belong to the BNF notation.
|
||||
All other symbols are terminals.
|
||||
|
||||
| //Module// | -> | //[Binding]//
|
||||
| //Binding// | -> | //Declaration//
|
||||
| | **|** | //Definition//
|
||||
| | **|** | ``{#`` //Pragma// ``#}``
|
||||
| //Declaration// | -> | //Name// ``:`` //Type//
|
||||
| | **|** | //Type//
|
||||
| //Definition// | -> | //Name// ``=`` //Expression//
|
||||
| | **|** | //Expression//
|
||||
| //Type// | -> | //Name//
|
||||
| | **|** | //Type// //Type//
|
||||
| | **|** | //Type// ``->`` //Type//
|
||||
| | **|** | ``{{`` //[Declaration]// ``}}``
|
||||
| | **|** | ``{`` //[Declaration]// ``}``
|
||||
| | **|** | ``[`` //[Declaration]// ``]``
|
||||
| | **|** | ``(`` //Type// ``)``
|
||||
| //Pragma// | -> | //[Name]//
|
||||
| //[Binding]// | -> | **eps**
|
||||
| | **|** | //Binding//
|
||||
| | **|** | //Binding// ``,`` //[Binding]//
|
||||
| //[Declaration]// | -> | **eps**
|
||||
| | **|** | //Declaration//
|
||||
| | **|** | //Declaration// ``,`` //[Declaration]//
|
||||
| //[Definition]// | -> | **eps**
|
||||
| | **|** | //Definition//
|
||||
| | **|** | //Definition// ``,`` //[Definition]//
|
||||
| //[Type]// | -> | //Type//
|
||||
| | **|** | //Type// ``,`` //[Type]//
|
||||
| //[Name]// | -> | //Name//
|
||||
| | **|** | //Name// //[Name]//
|
||||
| //Expression// | -> | //Name//
|
||||
| | **|** | //NumericLiteral//
|
||||
| | **|** | //Expression// //Expression//
|
||||
| | **|** | //Expression// ``->`` //Expression//
|
||||
| | **|** | ``{{`` //Module// ``}}``
|
||||
| | **|** | ``{`` //Module// ``}``
|
||||
| | **|** | ``[`` //Module// ``]``
|
||||
| | **|** | ``(`` //Expression// ``)``
|
||||
|
||||
|
85
src/Language/Lang/ErrM.hs
Normal file
85
src/Language/Lang/ErrM.hs
Normal file
|
@ -0,0 +1,85 @@
|
|||
{-# LANGUAGE CPP #-}
|
||||
|
||||
#if __GLASGOW_HASKELL__ >= 708
|
||||
---------------------------------------------------------------------------
|
||||
-- Pattern synonyms exist since ghc 7.8.
|
||||
|
||||
-- | BNF Converter: Error Monad.
|
||||
--
|
||||
-- Module for backwards compatibility.
|
||||
--
|
||||
-- The generated parser now uses @'Either' String@ as error monad.
|
||||
-- This module defines a type synonym 'Err' and pattern synonyms
|
||||
-- 'Bad' and 'Ok' for 'Left' and 'Right'.
|
||||
|
||||
{-# LANGUAGE PatternSynonyms #-}
|
||||
{-# LANGUAGE FlexibleInstances #-}
|
||||
{-# LANGUAGE TypeSynonymInstances #-}
|
||||
|
||||
module Language.Lang.ErrM where
|
||||
|
||||
import Control.Monad (MonadPlus(..))
|
||||
import Control.Applicative (Alternative(..))
|
||||
|
||||
-- | Error monad with 'String' error messages.
|
||||
type Err = Either String
|
||||
|
||||
pattern Bad msg = Left msg
|
||||
pattern Ok a = Right a
|
||||
|
||||
#if __GLASGOW_HASKELL__ >= 808
|
||||
instance MonadFail Err where
|
||||
fail = Bad
|
||||
#endif
|
||||
|
||||
instance Alternative Err where
|
||||
empty = Left "Err.empty"
|
||||
(<|>) Left{} = id
|
||||
(<|>) x@Right{} = const x
|
||||
|
||||
instance MonadPlus Err where
|
||||
mzero = empty
|
||||
mplus = (<|>)
|
||||
|
||||
#else
|
||||
---------------------------------------------------------------------------
|
||||
-- ghc 7.6 and before: use old definition as data type.
|
||||
|
||||
-- | BNF Converter: Error Monad
|
||||
|
||||
-- Copyright (C) 2004 Author: Aarne Ranta
|
||||
-- This file comes with NO WARRANTY and may be used FOR ANY PURPOSE.
|
||||
|
||||
module Language.Lang.ErrM where
|
||||
|
||||
-- the Error monad: like Maybe type with error msgs
|
||||
|
||||
import Control.Applicative (Applicative(..), Alternative(..))
|
||||
import Control.Monad (MonadPlus(..), liftM)
|
||||
|
||||
data Err a = Ok a | Bad String
|
||||
deriving (Read, Show, Eq, Ord)
|
||||
|
||||
instance Monad Err where
|
||||
return = Ok
|
||||
Ok a >>= f = f a
|
||||
Bad s >>= _ = Bad s
|
||||
|
||||
instance Applicative Err where
|
||||
pure = Ok
|
||||
(Bad s) <*> _ = Bad s
|
||||
(Ok f) <*> o = liftM f o
|
||||
|
||||
instance Functor Err where
|
||||
fmap = liftM
|
||||
|
||||
instance MonadPlus Err where
|
||||
mzero = Bad "Err.mzero"
|
||||
mplus (Bad _) y = y
|
||||
mplus x _ = x
|
||||
|
||||
instance Alternative Err where
|
||||
empty = mzero
|
||||
(<|>) = mplus
|
||||
|
||||
#endif
|
275
src/Language/Lang/LayoutGrammer.hs
Normal file
275
src/Language/Lang/LayoutGrammer.hs
Normal file
|
@ -0,0 +1,275 @@
|
|||
module Language.Lang.LayoutGrammer where
|
||||
|
||||
import Language.Lang.LexGrammer
|
||||
|
||||
|
||||
|
||||
import Data.Maybe (isNothing, fromJust)
|
||||
|
||||
-- Generated by the BNF Converter
|
||||
|
||||
-- local parameters
|
||||
|
||||
|
||||
topLayout :: Bool
|
||||
topLayout = False
|
||||
|
||||
layoutWords, layoutStopWords :: [String]
|
||||
layoutWords = ["->"]
|
||||
layoutStopWords = []
|
||||
|
||||
-- layout separators
|
||||
|
||||
|
||||
layoutOpen, layoutClose, layoutSep :: String
|
||||
layoutOpen = "{"
|
||||
layoutClose = "}"
|
||||
layoutSep = ";"
|
||||
|
||||
-- | Replace layout syntax with explicit layout tokens.
|
||||
resolveLayout :: Bool -- ^ Whether to use top-level layout.
|
||||
-> [Token] -> [Token]
|
||||
resolveLayout tp = res Nothing [if tl then Implicit 1 else Explicit]
|
||||
where
|
||||
-- Do top-level layout if the function parameter and the grammar say so.
|
||||
tl = tp && topLayout
|
||||
|
||||
res :: Maybe Token -- ^ The previous token, if any.
|
||||
-> [Block] -- ^ A stack of layout blocks.
|
||||
-> [Token] -> [Token]
|
||||
|
||||
-- The stack should never be empty.
|
||||
res _ [] ts = error $ "Layout error: stack empty. Tokens: " ++ show ts
|
||||
|
||||
res _ st (t0:ts)
|
||||
-- We found an open brace in the input,
|
||||
-- put an explicit layout block on the stack.
|
||||
-- This is done even if there was no layout word,
|
||||
-- to keep opening and closing braces.
|
||||
| isLayoutOpen t0 = moveAlong (Explicit:st) [t0] ts
|
||||
|
||||
-- We are in an implicit layout block
|
||||
res pt st@(Implicit n:ns) (t0:ts)
|
||||
|
||||
-- End of implicit block by a layout stop word
|
||||
| isStop t0 =
|
||||
-- Exit the current block and all implicit blocks
|
||||
-- more indented than the current token
|
||||
let (ebs,ns') = span (`moreIndent` column t0) ns
|
||||
moreIndent (Implicit x) y = x > y
|
||||
moreIndent Explicit _ = False
|
||||
-- the number of blocks exited
|
||||
b = 1 + length ebs
|
||||
bs = replicate b layoutClose
|
||||
-- Insert closing braces after the previous token.
|
||||
(ts1,ts2) = splitAt (1+b) $ addTokens (afterPrev pt) bs (t0:ts)
|
||||
in moveAlong ns' ts1 ts2
|
||||
|
||||
-- End of an implicit layout block
|
||||
| newLine pt t0 && column t0 < n =
|
||||
-- Insert a closing brace after the previous token.
|
||||
let b:t0':ts' = addToken (afterPrev pt) layoutClose (t0:ts)
|
||||
-- Repeat, with the current block removed from the stack
|
||||
in moveAlong ns [b] (t0':ts')
|
||||
|
||||
res pt st (t0:ts)
|
||||
-- Start a new layout block if the first token is a layout word
|
||||
| isLayout t0 =
|
||||
case ts of
|
||||
-- Explicit layout, just move on. The case above
|
||||
-- will push an explicit layout block.
|
||||
t1:_ | isLayoutOpen t1 -> moveAlong st [t0] ts
|
||||
-- The column of the next token determines the starting column
|
||||
-- of the implicit layout block.
|
||||
-- However, the next block needs to be strictly more indented
|
||||
-- than the previous block.
|
||||
_ -> let col = max (indentation st + 1) $
|
||||
-- at end of file, the start column doesn't matter
|
||||
if null ts then column t0 else column (head ts)
|
||||
-- insert an open brace after the layout word
|
||||
b:ts' = addToken (nextPos t0) layoutOpen ts
|
||||
-- save the start column
|
||||
st' = Implicit col:st
|
||||
in -- Do we have to insert an extra layoutSep?
|
||||
case st of
|
||||
Implicit n:_
|
||||
| newLine pt t0 && column t0 == n
|
||||
&& not (isNothing pt ||
|
||||
isTokenIn [layoutSep,layoutOpen] (fromJust pt)) ->
|
||||
let b':t0':b'':ts'' =
|
||||
addToken (afterPrev pt) layoutSep (t0:b:ts')
|
||||
in moveAlong st' [b',t0',b''] ts'
|
||||
_ -> moveAlong st' [t0,b] ts'
|
||||
|
||||
-- If we encounter a closing brace, exit the first explicit layout block.
|
||||
| isLayoutClose t0 =
|
||||
let st' = drop 1 (dropWhile isImplicit st)
|
||||
in if null st'
|
||||
then error $ "Layout error: Found " ++ layoutClose ++ " at ("
|
||||
++ show (line t0) ++ "," ++ show (column t0)
|
||||
++ ") without an explicit layout block."
|
||||
else moveAlong st' [t0] ts
|
||||
|
||||
-- Insert separator if necessary.
|
||||
res pt st@(Implicit n:ns) (t0:ts)
|
||||
-- Encounted a new line in an implicit layout block.
|
||||
| newLine pt t0 && column t0 == n =
|
||||
-- Insert a semicolon after the previous token.
|
||||
-- unless we are the beginning of the file,
|
||||
-- or the previous token is a semicolon or open brace.
|
||||
if isNothing pt || isTokenIn [layoutSep,layoutOpen] (fromJust pt)
|
||||
then moveAlong st [t0] ts
|
||||
else let b:t0':ts' = addToken (afterPrev pt) layoutSep (t0:ts)
|
||||
in moveAlong st [b,t0'] ts'
|
||||
|
||||
-- Nothing to see here, move along.
|
||||
res _ st (t:ts) = moveAlong st [t] ts
|
||||
|
||||
-- At EOF: skip explicit blocks.
|
||||
res (Just t) (Explicit:bs) [] | null bs = []
|
||||
| otherwise = res (Just t) bs []
|
||||
|
||||
-- If we are using top-level layout, insert a semicolon after
|
||||
-- the last token, if there isn't one already
|
||||
res (Just t) [Implicit _n] []
|
||||
| isTokenIn [layoutSep] t = []
|
||||
| otherwise = addToken (nextPos t) layoutSep []
|
||||
|
||||
-- At EOF in an implicit, non-top-level block: close the block
|
||||
res (Just t) (Implicit _n:bs) [] =
|
||||
let c = addToken (nextPos t) layoutClose []
|
||||
in moveAlong bs c []
|
||||
|
||||
-- This should only happen if the input is empty.
|
||||
res Nothing _st [] = []
|
||||
|
||||
-- | Move on to the next token.
|
||||
moveAlong :: [Block] -- ^ The layout stack.
|
||||
-> [Token] -- ^ Any tokens just processed.
|
||||
-> [Token] -- ^ the rest of the tokens.
|
||||
-> [Token]
|
||||
moveAlong _ [] _ = error "Layout error: moveAlong got [] as old tokens"
|
||||
moveAlong st ot ts = ot ++ res (Just $ last ot) st ts
|
||||
|
||||
newLine :: Maybe Token -> Token -> Bool
|
||||
newLine pt t0 = case pt of
|
||||
Nothing -> True
|
||||
Just t -> line t /= line t0
|
||||
|
||||
data Block
|
||||
= Implicit Int -- ^ An implicit layout block with its start column.
|
||||
| Explicit
|
||||
deriving Show
|
||||
|
||||
-- | Get current indentation. 0 if we are in an explicit block.
|
||||
indentation :: [Block] -> Int
|
||||
indentation (Implicit n : _) = n
|
||||
indentation _ = 0
|
||||
|
||||
-- | Check if s block is implicit.
|
||||
isImplicit :: Block -> Bool
|
||||
isImplicit (Implicit _) = True
|
||||
isImplicit _ = False
|
||||
|
||||
type Position = Posn
|
||||
|
||||
-- | Insert a number of tokens at the begninning of a list of tokens.
|
||||
addTokens :: Position -- ^ Position of the first new token.
|
||||
-> [String] -- ^ Token symbols.
|
||||
-> [Token] -- ^ The rest of the tokens. These will have their
|
||||
-- positions updated to make room for the new tokens .
|
||||
-> [Token]
|
||||
addTokens p ss ts = foldr (addToken p) ts ss
|
||||
|
||||
-- | Insert a new symbol token at the begninning of a list of tokens.
|
||||
addToken :: Position -- ^ Position of the new token.
|
||||
-> String -- ^ Symbol in the new token.
|
||||
-> [Token] -- ^ The rest of the tokens. These will have their
|
||||
-- positions updated to make room for the new token.
|
||||
-> [Token]
|
||||
addToken p s ts = sToken p s : map (incrGlobal p (length s)) ts
|
||||
|
||||
-- | Get the position immediately to the right of the given token.
|
||||
-- If no token is given, gets the first position in the file.
|
||||
afterPrev :: Maybe Token -> Position
|
||||
afterPrev = maybe (Pn 0 1 1) nextPos
|
||||
|
||||
-- | Get the position immediately to the right of the given token.
|
||||
nextPos :: Token -> Position
|
||||
nextPos t = Pn (g + s) l (c + s + 1)
|
||||
where Pn g l c = position t
|
||||
s = tokenLength t
|
||||
|
||||
-- | Add to the global and column positions of a token.
|
||||
-- The column position is only changed if the token is on
|
||||
-- the same line as the given position.
|
||||
incrGlobal :: Position -- ^ If the token is on the same line
|
||||
-- as this position, update the column position.
|
||||
-> Int -- ^ Number of characters to add to the position.
|
||||
-> Token -> Token
|
||||
incrGlobal (Pn _ l0 _) i (PT (Pn g l c) t) =
|
||||
if l /= l0 then PT (Pn (g + i) l c) t
|
||||
else PT (Pn (g + i) l (c + i)) t
|
||||
incrGlobal _ _ p = error $ "cannot add token at " ++ show p
|
||||
|
||||
-- | Create a symbol token.
|
||||
sToken :: Position -> String -> Token
|
||||
sToken p s = PT p (TS s i)
|
||||
where
|
||||
i = case s of
|
||||
"#}" -> 1
|
||||
"(" -> 2
|
||||
")" -> 3
|
||||
"," -> 4
|
||||
"->" -> 5
|
||||
":" -> 6
|
||||
"=" -> 7
|
||||
"[" -> 8
|
||||
"]" -> 9
|
||||
"{" -> 10
|
||||
"{#" -> 11
|
||||
"{{" -> 12
|
||||
"}" -> 13
|
||||
"}}" -> 14
|
||||
_ -> error $ "not a reserved word: " ++ show s
|
||||
|
||||
-- | Get the position of a token.
|
||||
position :: Token -> Position
|
||||
position t = case t of
|
||||
PT p _ -> p
|
||||
Err p -> p
|
||||
|
||||
-- | Get the line number of a token.
|
||||
line :: Token -> Int
|
||||
line t = case position t of Pn _ l _ -> l
|
||||
|
||||
-- | Get the column number of a token.
|
||||
column :: Token -> Int
|
||||
column t = case position t of Pn _ _ c -> c
|
||||
|
||||
-- | Check if a token is one of the given symbols.
|
||||
isTokenIn :: [String] -> Token -> Bool
|
||||
isTokenIn ts t = case t of
|
||||
PT _ (TS r _) | r `elem` ts -> True
|
||||
_ -> False
|
||||
|
||||
-- | Check if a word is a layout start token.
|
||||
isLayout :: Token -> Bool
|
||||
isLayout = isTokenIn layoutWords
|
||||
|
||||
-- | Check if a token is a layout stop token.
|
||||
isStop :: Token -> Bool
|
||||
isStop = isTokenIn layoutStopWords
|
||||
|
||||
-- | Check if a token is the layout open token.
|
||||
isLayoutOpen :: Token -> Bool
|
||||
isLayoutOpen = isTokenIn [layoutOpen]
|
||||
|
||||
-- | Check if a token is the layout close token.
|
||||
isLayoutClose :: Token -> Bool
|
||||
isLayoutClose = isTokenIn [layoutClose]
|
||||
|
||||
-- | Get the number of characters in the token.
|
||||
tokenLength :: Token -> Int
|
||||
tokenLength t = length $ prToken t
|
||||
|
493
src/Language/Lang/LexGrammer.hs
Normal file
493
src/Language/Lang/LexGrammer.hs
Normal file
File diff suppressed because one or more lines are too long
200
src/Language/Lang/LexGrammer.x
Normal file
200
src/Language/Lang/LexGrammer.x
Normal file
|
@ -0,0 +1,200 @@
|
|||
-- -*- haskell -*-
|
||||
-- This Alex file was machine-generated by the BNF converter
|
||||
{
|
||||
{-# OPTIONS -fno-warn-incomplete-patterns #-}
|
||||
{-# OPTIONS_GHC -w #-}
|
||||
module Language.Lang.LexGrammer where
|
||||
|
||||
import qualified Data.Bits
|
||||
import Data.Word (Word8)
|
||||
import Data.Char (ord)
|
||||
}
|
||||
|
||||
|
||||
$c = [A-Z\192-\221] # [\215] -- capital isolatin1 letter (215 = \times) FIXME
|
||||
$s = [a-z\222-\255] # [\247] -- small isolatin1 letter (247 = \div ) FIXME
|
||||
$l = [$c $s] -- letter
|
||||
$d = [0-9] -- digit
|
||||
$i = [$l $d _ '] -- identifier character
|
||||
$u = [. \n] -- universal: any character
|
||||
|
||||
@rsyms = -- symbols and non-identifier-like reserved words
|
||||
\{ \# | \# \} | \: | \= | \- \> | \{ \{ | \} \} | \{ | \} | \[ | \] | \( | \) | \,
|
||||
|
||||
:-
|
||||
|
||||
-- Line comments
|
||||
"--" [.]* ;
|
||||
|
||||
-- Block comments
|
||||
"{-" [$u # \-]* \- ([$u # [\- \}]] [$u # \-]* \- | \-)* \} ;
|
||||
|
||||
$white+ ;
|
||||
@rsyms
|
||||
{ tok (\p s -> PT p (eitherResIdent (TV . share) s)) }
|
||||
([\' \_]| $l)([\' \- \. \_]| ($d | $l)) *
|
||||
{ tok (\p s -> PT p (eitherResIdent (T_Name . share) s)) }
|
||||
$d + \. ? $d * | $d * \. ? $d + (e $d +)?
|
||||
{ tok (\p s -> PT p (eitherResIdent (T_NumericLiteral . share) s)) }
|
||||
|
||||
$l $i*
|
||||
{ tok (\p s -> PT p (eitherResIdent (TV . share) s)) }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{
|
||||
|
||||
tok :: (Posn -> String -> Token) -> (Posn -> String -> Token)
|
||||
tok f p s = f p s
|
||||
|
||||
share :: String -> String
|
||||
share = id
|
||||
|
||||
data Tok =
|
||||
TS !String !Int -- reserved words and symbols
|
||||
| TL !String -- string literals
|
||||
| TI !String -- integer literals
|
||||
| TV !String -- identifiers
|
||||
| TD !String -- double precision float literals
|
||||
| TC !String -- character literals
|
||||
| T_Name !String
|
||||
| T_NumericLiteral !String
|
||||
|
||||
deriving (Eq,Show,Ord)
|
||||
|
||||
data Token =
|
||||
PT Posn Tok
|
||||
| Err Posn
|
||||
deriving (Eq,Show,Ord)
|
||||
|
||||
printPosn :: Posn -> String
|
||||
printPosn (Pn _ l c) = "line " ++ show l ++ ", column " ++ show c
|
||||
|
||||
tokenPos :: [Token] -> String
|
||||
tokenPos (t:_) = printPosn (tokenPosn t)
|
||||
tokenPos [] = "end of file"
|
||||
|
||||
tokenPosn :: Token -> Posn
|
||||
tokenPosn (PT p _) = p
|
||||
tokenPosn (Err p) = p
|
||||
|
||||
tokenLineCol :: Token -> (Int, Int)
|
||||
tokenLineCol = posLineCol . tokenPosn
|
||||
|
||||
posLineCol :: Posn -> (Int, Int)
|
||||
posLineCol (Pn _ l c) = (l,c)
|
||||
|
||||
mkPosToken :: Token -> ((Int, Int), String)
|
||||
mkPosToken t@(PT p _) = (posLineCol p, prToken t)
|
||||
|
||||
prToken :: Token -> String
|
||||
prToken t = case t of
|
||||
PT _ (TS s _) -> s
|
||||
PT _ (TL s) -> show s
|
||||
PT _ (TI s) -> s
|
||||
PT _ (TV s) -> s
|
||||
PT _ (TD s) -> s
|
||||
PT _ (TC s) -> s
|
||||
Err _ -> "#error"
|
||||
PT _ (T_Name s) -> s
|
||||
PT _ (T_NumericLiteral s) -> s
|
||||
|
||||
|
||||
data BTree = N | B String Tok BTree BTree deriving (Show)
|
||||
|
||||
eitherResIdent :: (String -> Tok) -> String -> Tok
|
||||
eitherResIdent tv s = treeFind resWords
|
||||
where
|
||||
treeFind N = tv s
|
||||
treeFind (B a t left right) | s < a = treeFind left
|
||||
| s > a = treeFind right
|
||||
| s == a = t
|
||||
|
||||
resWords :: BTree
|
||||
resWords = b "[" 8 (b "," 4 (b "(" 2 (b "#}" 1 N N) (b ")" 3 N N)) (b ":" 6 (b "->" 5 N N) (b "=" 7 N N))) (b "{{" 12 (b "{" 10 (b "]" 9 N N) (b "{#" 11 N N)) (b "}}" 14 (b "}" 13 N N) N))
|
||||
where b s n = let bs = s
|
||||
in B bs (TS bs n)
|
||||
|
||||
unescapeInitTail :: String -> String
|
||||
unescapeInitTail = id . unesc . tail . id
|
||||
where
|
||||
unesc s = case s of
|
||||
'\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
|
||||
'\\':'n':cs -> '\n' : unesc cs
|
||||
'\\':'t':cs -> '\t' : unesc cs
|
||||
'\\':'r':cs -> '\r' : unesc cs
|
||||
'\\':'f':cs -> '\f' : unesc cs
|
||||
'"':[] -> []
|
||||
c:cs -> c : unesc cs
|
||||
_ -> []
|
||||
|
||||
-------------------------------------------------------------------
|
||||
-- Alex wrapper code.
|
||||
-- A modified "posn" wrapper.
|
||||
-------------------------------------------------------------------
|
||||
|
||||
data Posn = Pn !Int !Int !Int
|
||||
deriving (Eq, Show,Ord)
|
||||
|
||||
alexStartPos :: Posn
|
||||
alexStartPos = Pn 0 1 1
|
||||
|
||||
alexMove :: Posn -> Char -> Posn
|
||||
alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1)
|
||||
alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1
|
||||
alexMove (Pn a l c) _ = Pn (a+1) l (c+1)
|
||||
|
||||
type Byte = Word8
|
||||
|
||||
type AlexInput = (Posn, -- current position,
|
||||
Char, -- previous char
|
||||
[Byte], -- pending bytes on the current char
|
||||
String) -- current input string
|
||||
|
||||
tokens :: String -> [Token]
|
||||
tokens str = go (alexStartPos, '\n', [], str)
|
||||
where
|
||||
go :: AlexInput -> [Token]
|
||||
go inp@(pos, _, _, str) =
|
||||
case alexScan inp 0 of
|
||||
AlexEOF -> []
|
||||
AlexError (pos, _, _, _) -> [Err pos]
|
||||
AlexSkip inp' len -> go inp'
|
||||
AlexToken inp' len act -> act pos (take len str) : (go inp')
|
||||
|
||||
alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)
|
||||
alexGetByte (p, c, (b:bs), s) = Just (b, (p, c, bs, s))
|
||||
alexGetByte (p, _, [], s) =
|
||||
case s of
|
||||
[] -> Nothing
|
||||
(c:s) ->
|
||||
let p' = alexMove p c
|
||||
(b:bs) = utf8Encode c
|
||||
in p' `seq` Just (b, (p', c, bs, s))
|
||||
|
||||
alexInputPrevChar :: AlexInput -> Char
|
||||
alexInputPrevChar (p, c, bs, s) = c
|
||||
|
||||
-- | Encode a Haskell String to a list of Word8 values, in UTF8 format.
|
||||
utf8Encode :: Char -> [Word8]
|
||||
utf8Encode = map fromIntegral . go . ord
|
||||
where
|
||||
go oc
|
||||
| oc <= 0x7f = [oc]
|
||||
|
||||
| oc <= 0x7ff = [ 0xc0 + (oc `Data.Bits.shiftR` 6)
|
||||
, 0x80 + oc Data.Bits..&. 0x3f
|
||||
]
|
||||
|
||||
| oc <= 0xffff = [ 0xe0 + (oc `Data.Bits.shiftR` 12)
|
||||
, 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)
|
||||
, 0x80 + oc Data.Bits..&. 0x3f
|
||||
]
|
||||
| otherwise = [ 0xf0 + (oc `Data.Bits.shiftR` 18)
|
||||
, 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)
|
||||
, 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)
|
||||
, 0x80 + oc Data.Bits..&. 0x3f
|
||||
]
|
||||
}
|
914
src/Language/Lang/ParGrammer.hs
Normal file
914
src/Language/Lang/ParGrammer.hs
Normal file
|
@ -0,0 +1,914 @@
|
|||
{-# OPTIONS_GHC -w #-}
|
||||
{-# OPTIONS -XMagicHash -XBangPatterns -XTypeSynonymInstances -XFlexibleInstances -cpp #-}
|
||||
#if __GLASGOW_HASKELL__ >= 710
|
||||
{-# OPTIONS_GHC -XPartialTypeSignatures #-}
|
||||
#endif
|
||||
{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
|
||||
module Language.Lang.ParGrammer where
|
||||
import qualified Language.Lang.AbsGrammer
|
||||
import Language.Lang.LexGrammer
|
||||
import qualified Data.Array as Happy_Data_Array
|
||||
import qualified Data.Bits as Bits
|
||||
import qualified GHC.Exts as Happy_GHC_Exts
|
||||
import Control.Applicative(Applicative(..))
|
||||
import Control.Monad (ap)
|
||||
|
||||
-- parser produced by Happy Version 1.19.12
|
||||
|
||||
newtype HappyAbsSyn = HappyAbsSyn HappyAny
|
||||
#if __GLASGOW_HASKELL__ >= 607
|
||||
type HappyAny = Happy_GHC_Exts.Any
|
||||
#else
|
||||
type HappyAny = forall a . a
|
||||
#endif
|
||||
newtype HappyWrap4 = HappyWrap4 (Language.Lang.AbsGrammer.Name)
|
||||
happyIn4 :: (Language.Lang.AbsGrammer.Name) -> (HappyAbsSyn )
|
||||
happyIn4 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap4 x)
|
||||
{-# INLINE happyIn4 #-}
|
||||
happyOut4 :: (HappyAbsSyn ) -> HappyWrap4
|
||||
happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut4 #-}
|
||||
newtype HappyWrap5 = HappyWrap5 (Language.Lang.AbsGrammer.NumericLiteral)
|
||||
happyIn5 :: (Language.Lang.AbsGrammer.NumericLiteral) -> (HappyAbsSyn )
|
||||
happyIn5 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap5 x)
|
||||
{-# INLINE happyIn5 #-}
|
||||
happyOut5 :: (HappyAbsSyn ) -> HappyWrap5
|
||||
happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut5 #-}
|
||||
newtype HappyWrap6 = HappyWrap6 (Language.Lang.AbsGrammer.Module)
|
||||
happyIn6 :: (Language.Lang.AbsGrammer.Module) -> (HappyAbsSyn )
|
||||
happyIn6 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap6 x)
|
||||
{-# INLINE happyIn6 #-}
|
||||
happyOut6 :: (HappyAbsSyn ) -> HappyWrap6
|
||||
happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut6 #-}
|
||||
newtype HappyWrap7 = HappyWrap7 (Language.Lang.AbsGrammer.Binding)
|
||||
happyIn7 :: (Language.Lang.AbsGrammer.Binding) -> (HappyAbsSyn )
|
||||
happyIn7 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap7 x)
|
||||
{-# INLINE happyIn7 #-}
|
||||
happyOut7 :: (HappyAbsSyn ) -> HappyWrap7
|
||||
happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut7 #-}
|
||||
newtype HappyWrap8 = HappyWrap8 (Language.Lang.AbsGrammer.Declaration)
|
||||
happyIn8 :: (Language.Lang.AbsGrammer.Declaration) -> (HappyAbsSyn )
|
||||
happyIn8 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap8 x)
|
||||
{-# INLINE happyIn8 #-}
|
||||
happyOut8 :: (HappyAbsSyn ) -> HappyWrap8
|
||||
happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut8 #-}
|
||||
newtype HappyWrap9 = HappyWrap9 (Language.Lang.AbsGrammer.Definition)
|
||||
happyIn9 :: (Language.Lang.AbsGrammer.Definition) -> (HappyAbsSyn )
|
||||
happyIn9 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap9 x)
|
||||
{-# INLINE happyIn9 #-}
|
||||
happyOut9 :: (HappyAbsSyn ) -> HappyWrap9
|
||||
happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut9 #-}
|
||||
newtype HappyWrap10 = HappyWrap10 (Language.Lang.AbsGrammer.Type)
|
||||
happyIn10 :: (Language.Lang.AbsGrammer.Type) -> (HappyAbsSyn )
|
||||
happyIn10 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap10 x)
|
||||
{-# INLINE happyIn10 #-}
|
||||
happyOut10 :: (HappyAbsSyn ) -> HappyWrap10
|
||||
happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut10 #-}
|
||||
newtype HappyWrap11 = HappyWrap11 (Language.Lang.AbsGrammer.Pragma)
|
||||
happyIn11 :: (Language.Lang.AbsGrammer.Pragma) -> (HappyAbsSyn )
|
||||
happyIn11 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap11 x)
|
||||
{-# INLINE happyIn11 #-}
|
||||
happyOut11 :: (HappyAbsSyn ) -> HappyWrap11
|
||||
happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut11 #-}
|
||||
newtype HappyWrap12 = HappyWrap12 ([Language.Lang.AbsGrammer.Binding])
|
||||
happyIn12 :: ([Language.Lang.AbsGrammer.Binding]) -> (HappyAbsSyn )
|
||||
happyIn12 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap12 x)
|
||||
{-# INLINE happyIn12 #-}
|
||||
happyOut12 :: (HappyAbsSyn ) -> HappyWrap12
|
||||
happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut12 #-}
|
||||
newtype HappyWrap13 = HappyWrap13 ([Language.Lang.AbsGrammer.Declaration])
|
||||
happyIn13 :: ([Language.Lang.AbsGrammer.Declaration]) -> (HappyAbsSyn )
|
||||
happyIn13 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap13 x)
|
||||
{-# INLINE happyIn13 #-}
|
||||
happyOut13 :: (HappyAbsSyn ) -> HappyWrap13
|
||||
happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut13 #-}
|
||||
newtype HappyWrap14 = HappyWrap14 ([Language.Lang.AbsGrammer.Definition])
|
||||
happyIn14 :: ([Language.Lang.AbsGrammer.Definition]) -> (HappyAbsSyn )
|
||||
happyIn14 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap14 x)
|
||||
{-# INLINE happyIn14 #-}
|
||||
happyOut14 :: (HappyAbsSyn ) -> HappyWrap14
|
||||
happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut14 #-}
|
||||
newtype HappyWrap15 = HappyWrap15 ([Language.Lang.AbsGrammer.Type])
|
||||
happyIn15 :: ([Language.Lang.AbsGrammer.Type]) -> (HappyAbsSyn )
|
||||
happyIn15 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap15 x)
|
||||
{-# INLINE happyIn15 #-}
|
||||
happyOut15 :: (HappyAbsSyn ) -> HappyWrap15
|
||||
happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut15 #-}
|
||||
newtype HappyWrap16 = HappyWrap16 ([Language.Lang.AbsGrammer.Name])
|
||||
happyIn16 :: ([Language.Lang.AbsGrammer.Name]) -> (HappyAbsSyn )
|
||||
happyIn16 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap16 x)
|
||||
{-# INLINE happyIn16 #-}
|
||||
happyOut16 :: (HappyAbsSyn ) -> HappyWrap16
|
||||
happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut16 #-}
|
||||
newtype HappyWrap17 = HappyWrap17 (Language.Lang.AbsGrammer.Expression)
|
||||
happyIn17 :: (Language.Lang.AbsGrammer.Expression) -> (HappyAbsSyn )
|
||||
happyIn17 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap17 x)
|
||||
{-# INLINE happyIn17 #-}
|
||||
happyOut17 :: (HappyAbsSyn ) -> HappyWrap17
|
||||
happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOut17 #-}
|
||||
happyInTok :: (Token) -> (HappyAbsSyn )
|
||||
happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyInTok #-}
|
||||
happyOutTok :: (HappyAbsSyn ) -> (Token)
|
||||
happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
|
||||
{-# INLINE happyOutTok #-}
|
||||
|
||||
|
||||
happyExpList :: HappyAddr
|
||||
happyExpList = HappyA# "\x00\x00\x04\x9d\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x54\x02\x00\x00\x00\x00\x00\x00\x49\x65\x00\x00\x04\x95\x01\x00\x10\x74\x06\x00\x40\xd0\x19\x00\x00\x00\x20\x00\x00\x04\x9d\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x02\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x80\x00\x00\x00\x20\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\xb0\x54\x02\x00\xc0\x52\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x54\x06\x00\x40\x50\x19\x00\x00\x41\x67\x00\x00\x04\x9d\x01\x00\x10\x74\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x95\x00\x00\x10\x54\x02\x00\x40\x50\x09\x00\x00\x41\x25\x00\x00\x04\x95\x00\x00\x10\x74\x06\x00\x40\x50\x09\x00\x00\x41\x65\x00\x00\x24\x95\x01\x00\x90\x54\x02\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
|
||||
|
||||
{-# NOINLINE happyExpListPerState #-}
|
||||
happyExpListPerState st =
|
||||
token_strs_expected
|
||||
where token_strs = ["error","%dummy","%start_pModule","Name","NumericLiteral","Module","Binding","Declaration","Definition","Type","Pragma","ListBinding","ListDeclaration","ListDefinition","ListType","ListName","Expression","'#}'","'('","')'","','","'->'","':'","'='","'['","']'","'{'","'{#'","'{{'","'}'","'}}'","L_Name","L_NumericLiteral","%eof"]
|
||||
bit_start = st * 34
|
||||
bit_end = (st + 1) * 34
|
||||
read_bit = readArrayBit happyExpList
|
||||
bits = map read_bit [bit_start..bit_end - 1]
|
||||
bits_indexed = zip bits [0..33]
|
||||
token_strs_expected = concatMap f bits_indexed
|
||||
f (False, _) = []
|
||||
f (True, nr) = [token_strs !! nr]
|
||||
|
||||
happyActOffsets :: HappyAddr
|
||||
happyActOffsets = HappyA# "\x3c\x00\xf3\xff\x00\x00\xff\xff\x00\x00\xf9\xff\x10\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x48\x00\x66\x00\x0d\x00\x18\x00\x1a\x00\x24\x00\x00\x00\x1f\x00\x0a\x01\x23\x00\x2b\x00\x3b\x00\x00\x00\x34\x00\x41\x00\x4c\x00\x4d\x00\xe6\x00\xf1\x00\x33\x00\x00\x00\x48\x00\x6f\x00\x6f\x00\x51\x00\x51\x00\x51\x00\x00\x00\xfa\x00\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x51\x00\x03\x01\x6f\x00\x5d\x00\xfa\x00\x00\x00\x4b\x00\x56\x00\xfa\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00"#
|
||||
|
||||
happyGotoOffsets :: HappyAddr
|
||||
happyGotoOffsets = HappyA# "\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x11\x00\x10\x01\x80\x00\x8e\x00\x39\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x11\x00\x00\x00\x11\x00\x2a\x00\x8b\x00\xb8\x00\xc6\x00\xd4\x00\x00\x00\x1b\x00\x49\x00\x5e\x00\x74\x00\x15\x01\x1c\x01\xdf\x00\xf8\x00\x99\x00\xa7\x00\x01\x01\x00\x00\x00\x00\x00\x00\x01\x01\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x01\x00\x00\x00\x00\x00\x00"#
|
||||
|
||||
happyAdjustOffset :: Happy_GHC_Exts.Int# -> Happy_GHC_Exts.Int#
|
||||
happyAdjustOffset off = off
|
||||
|
||||
happyDefActions :: HappyAddr
|
||||
happyDefActions = HappyA# "\xec\xff\x00\x00\xfe\xff\xdf\xff\xde\xff\x00\x00\xeb\xff\xfb\xff\xfa\xff\xf7\xff\xfc\xff\xf5\xff\x00\x00\xe9\xff\xe9\xff\x00\x00\xe9\xff\xfd\xff\x00\x00\xe8\xff\x00\x00\xe1\xff\x00\x00\xed\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xff\x00\x00\x00\x00\xdf\xff\xdd\xff\x00\x00\x00\x00\xec\xff\xec\xff\xec\xff\xf4\xff\xf3\xff\x00\x00\x00\x00\xe9\xff\xe9\xff\xe9\xff\xec\xff\x00\x00\x00\x00\xf6\xff\xf8\xff\xea\xff\xf4\xff\xe8\xff\xf2\xff\xdc\xff\xd8\xff\xee\xff\xef\xff\xd9\xff\xf0\xff\xda\xff\xf9\xff\xe0\xff\xf1\xff\xe9\xff\xdb\xff\xe7\xff"#
|
||||
|
||||
happyCheck :: HappyAddr
|
||||
happyCheck = HappyA# "\xff\xff\x02\x00\x0f\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x11\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x02\x00\x11\x00\x00\x00\x01\x00\x00\x00\x04\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x02\x00\x00\x00\x0f\x00\x10\x00\x0d\x00\x0c\x00\x08\x00\x06\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x02\x00\x0f\x00\x10\x00\x0f\x00\x00\x00\x01\x00\x08\x00\x0e\x00\x0a\x00\x0b\x00\x0c\x00\x0e\x00\x0e\x00\x0f\x00\x10\x00\x02\x00\x03\x00\x0d\x00\x05\x00\x00\x00\x0f\x00\x08\x00\x01\x00\x0a\x00\x02\x00\x0c\x00\x07\x00\x0d\x00\x0f\x00\x10\x00\x08\x00\x0c\x00\x0a\x00\x0b\x00\x0c\x00\x00\x00\x02\x00\x0f\x00\x10\x00\x05\x00\x0d\x00\x06\x00\x08\x00\x06\x00\x0a\x00\x02\x00\x0c\x00\x09\x00\x09\x00\x0f\x00\x10\x00\x08\x00\x04\x00\x0a\x00\x0b\x00\x0c\x00\x00\x00\x02\x00\x0f\x00\x10\x00\x05\x00\xff\xff\x06\x00\x08\x00\xff\xff\x0a\x00\x02\x00\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\x08\x00\xff\xff\x0a\x00\x02\x00\x0c\x00\xff\xff\x00\x00\x0f\x00\x10\x00\x08\x00\x04\x00\x0a\x00\x06\x00\x0c\x00\xff\xff\x09\x00\x0f\x00\x10\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\x09\x00\xff\xff\x00\x00\x01\x00\x0d\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\x09\x00\x0d\x00\x00\x00\x01\x00\x0d\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\x09\x00\x0d\x00\x00\x00\x01\x00\x0d\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0d\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\xff\xff\xff\xff\x00\x00\x01\x00\x0d\x00\x03\x00\x04\x00\x05\x00\x06\x00\xff\xff\x08\x00\x02\x00\x03\x00\xff\xff\x05\x00\x0d\x00\xff\xff\x08\x00\xff\xff\x0a\x00\xff\xff\x0c\x00\x02\x00\x03\x00\x0f\x00\x05\x00\xff\xff\x00\x00\x08\x00\xff\xff\x0a\x00\x02\x00\x0c\x00\x06\x00\x05\x00\x0f\x00\x00\x00\x08\x00\xff\xff\x0a\x00\x02\x00\x0c\x00\x06\x00\xff\xff\x0f\x00\xff\xff\x08\x00\xff\xff\x0a\x00\x04\x00\x0c\x00\x00\x00\x01\x00\x0f\x00\x09\x00\xff\xff\x00\x00\x06\x00\x0d\x00\x0e\x00\x04\x00\xff\xff\x06\x00\x00\x00\x0d\x00\x09\x00\xff\xff\x04\x00\xff\xff\x06\x00\x00\x00\xff\xff\x09\x00\xff\xff\x04\x00\xff\xff\x06\x00\xff\xff\xff\xff\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
|
||||
|
||||
happyTable :: HappyAddr
|
||||
happyTable = HappyA# "\x00\x00\xdf\xff\x03\x00\xdf\xff\xdf\xff\x2f\x00\x30\x00\xdf\xff\xdf\xff\xdf\xff\xff\xff\xdf\xff\xdf\xff\xdf\xff\xdf\xff\x0d\x00\xdf\xff\x1f\x00\x04\x00\x15\x00\x2e\x00\x0e\x00\xe9\xff\x0f\x00\x10\x00\x11\x00\x0d\x00\x26\x00\x03\x00\x12\x00\x20\x00\x3e\x00\x0e\x00\x27\x00\x0f\x00\x10\x00\x11\x00\xe9\xff\x0d\x00\x03\x00\x12\x00\x03\x00\x1f\x00\x04\x00\x0e\x00\x42\x00\x0f\x00\x10\x00\x11\x00\x40\x00\xe9\xff\x03\x00\x12\x00\x22\x00\x38\x00\x1e\x00\x23\x00\x15\x00\x03\x00\x24\x00\x3e\x00\x25\x00\x0d\x00\x26\x00\x16\x00\x3d\x00\x03\x00\x12\x00\x0e\x00\x17\x00\x0f\x00\x10\x00\x11\x00\x26\x00\x22\x00\x03\x00\x12\x00\x23\x00\x3c\x00\x1d\x00\x24\x00\x2f\x00\x25\x00\x0d\x00\x26\x00\x3b\x00\x3a\x00\x03\x00\x12\x00\x0e\x00\x41\x00\x0f\x00\x10\x00\x11\x00\x26\x00\x22\x00\x03\x00\x12\x00\x23\x00\x00\x00\x35\x00\x24\x00\x00\x00\x25\x00\x0d\x00\x26\x00\x00\x00\x00\x00\x03\x00\x12\x00\x0e\x00\x00\x00\x0f\x00\x22\x00\x11\x00\x00\x00\x33\x00\x03\x00\x12\x00\x24\x00\x34\x00\x25\x00\x09\x00\x26\x00\x00\x00\x1b\x00\x03\x00\x12\x00\x03\x00\x04\x00\x1a\x00\x06\x00\x13\x00\x08\x00\x09\x00\x00\x00\x0a\x00\x1b\x00\x00\x00\x1f\x00\x04\x00\x0b\x00\x03\x00\x04\x00\x18\x00\x06\x00\x13\x00\x08\x00\x09\x00\x00\x00\x0a\x00\x19\x00\x36\x00\x1f\x00\x04\x00\x0b\x00\x03\x00\x04\x00\x12\x00\x06\x00\x13\x00\x08\x00\x09\x00\x00\x00\x0a\x00\x14\x00\x30\x00\x1f\x00\x04\x00\x0b\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x00\x00\x0a\x00\x00\x00\x20\x00\x00\x00\x00\x00\x0b\x00\x03\x00\x04\x00\x1a\x00\x06\x00\x07\x00\x08\x00\x09\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x03\x00\x04\x00\x18\x00\x06\x00\x07\x00\x08\x00\x09\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x03\x00\x04\x00\x12\x00\x06\x00\x07\x00\x08\x00\x09\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x03\x00\x04\x00\x0b\x00\x06\x00\x07\x00\x08\x00\x09\x00\x00\x00\x32\x00\xdf\xff\xdf\xff\x00\x00\xdf\xff\x0b\x00\x00\x00\xdf\xff\x00\x00\xdf\xff\x00\x00\xdf\xff\x29\x00\x39\x00\xdf\xff\x2a\x00\x00\x00\x26\x00\x2b\x00\x00\x00\x2c\x00\x29\x00\x2d\x00\x31\x00\x2a\x00\x03\x00\x26\x00\x2b\x00\x00\x00\x2c\x00\x29\x00\x2d\x00\x27\x00\x00\x00\x03\x00\x00\x00\x2b\x00\x00\x00\x2c\x00\x41\x00\x2d\x00\x1c\x00\x04\x00\x03\x00\xe8\xff\x00\x00\x33\x00\x1d\x00\xe8\xff\xe8\xff\x34\x00\x00\x00\x09\x00\x33\x00\x1e\x00\x19\x00\x00\x00\x34\x00\x00\x00\x09\x00\x33\x00\x00\x00\x14\x00\x00\x00\x34\x00\x00\x00\x09\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
|
||||
|
||||
happyReduceArr = Happy_Data_Array.array (1, 39) [
|
||||
(1 , happyReduce_1),
|
||||
(2 , happyReduce_2),
|
||||
(3 , happyReduce_3),
|
||||
(4 , happyReduce_4),
|
||||
(5 , happyReduce_5),
|
||||
(6 , happyReduce_6),
|
||||
(7 , happyReduce_7),
|
||||
(8 , happyReduce_8),
|
||||
(9 , happyReduce_9),
|
||||
(10 , happyReduce_10),
|
||||
(11 , happyReduce_11),
|
||||
(12 , happyReduce_12),
|
||||
(13 , happyReduce_13),
|
||||
(14 , happyReduce_14),
|
||||
(15 , happyReduce_15),
|
||||
(16 , happyReduce_16),
|
||||
(17 , happyReduce_17),
|
||||
(18 , happyReduce_18),
|
||||
(19 , happyReduce_19),
|
||||
(20 , happyReduce_20),
|
||||
(21 , happyReduce_21),
|
||||
(22 , happyReduce_22),
|
||||
(23 , happyReduce_23),
|
||||
(24 , happyReduce_24),
|
||||
(25 , happyReduce_25),
|
||||
(26 , happyReduce_26),
|
||||
(27 , happyReduce_27),
|
||||
(28 , happyReduce_28),
|
||||
(29 , happyReduce_29),
|
||||
(30 , happyReduce_30),
|
||||
(31 , happyReduce_31),
|
||||
(32 , happyReduce_32),
|
||||
(33 , happyReduce_33),
|
||||
(34 , happyReduce_34),
|
||||
(35 , happyReduce_35),
|
||||
(36 , happyReduce_36),
|
||||
(37 , happyReduce_37),
|
||||
(38 , happyReduce_38),
|
||||
(39 , happyReduce_39)
|
||||
]
|
||||
|
||||
happy_n_terms = 18 :: Int
|
||||
happy_n_nonterms = 14 :: Int
|
||||
|
||||
happyReduce_1 = happySpecReduce_1 0# happyReduction_1
|
||||
happyReduction_1 happy_x_1
|
||||
= case happyOutTok happy_x_1 of { (PT _ (T_Name happy_var_1)) ->
|
||||
happyIn4
|
||||
(Language.Lang.AbsGrammer.Name happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_2 = happySpecReduce_1 1# happyReduction_2
|
||||
happyReduction_2 happy_x_1
|
||||
= case happyOutTok happy_x_1 of { (PT _ (T_NumericLiteral happy_var_1)) ->
|
||||
happyIn5
|
||||
(Language.Lang.AbsGrammer.NumericLiteral happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_3 = happySpecReduce_1 2# happyReduction_3
|
||||
happyReduction_3 happy_x_1
|
||||
= case happyOut12 happy_x_1 of { (HappyWrap12 happy_var_1) ->
|
||||
happyIn6
|
||||
(Language.Lang.AbsGrammer.Module happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_4 = happySpecReduce_1 3# happyReduction_4
|
||||
happyReduction_4 happy_x_1
|
||||
= case happyOut8 happy_x_1 of { (HappyWrap8 happy_var_1) ->
|
||||
happyIn7
|
||||
(Language.Lang.AbsGrammer.BindingDeclaration happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_5 = happySpecReduce_1 3# happyReduction_5
|
||||
happyReduction_5 happy_x_1
|
||||
= case happyOut9 happy_x_1 of { (HappyWrap9 happy_var_1) ->
|
||||
happyIn7
|
||||
(Language.Lang.AbsGrammer.BindingDefinition happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_6 = happySpecReduce_3 3# happyReduction_6
|
||||
happyReduction_6 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut11 happy_x_2 of { (HappyWrap11 happy_var_2) ->
|
||||
happyIn7
|
||||
(Language.Lang.AbsGrammer.BindingPragma happy_var_2
|
||||
)}
|
||||
|
||||
happyReduce_7 = happySpecReduce_3 4# happyReduction_7
|
||||
happyReduction_7 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut4 happy_x_1 of { (HappyWrap4 happy_var_1) ->
|
||||
case happyOut10 happy_x_3 of { (HappyWrap10 happy_var_3) ->
|
||||
happyIn8
|
||||
(Language.Lang.AbsGrammer.DeclarationNamed happy_var_1 happy_var_3
|
||||
)}}
|
||||
|
||||
happyReduce_8 = happySpecReduce_1 4# happyReduction_8
|
||||
happyReduction_8 happy_x_1
|
||||
= case happyOut10 happy_x_1 of { (HappyWrap10 happy_var_1) ->
|
||||
happyIn8
|
||||
(Language.Lang.AbsGrammer.DeclarationAnonymous happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_9 = happySpecReduce_3 5# happyReduction_9
|
||||
happyReduction_9 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut4 happy_x_1 of { (HappyWrap4 happy_var_1) ->
|
||||
case happyOut17 happy_x_3 of { (HappyWrap17 happy_var_3) ->
|
||||
happyIn9
|
||||
(Language.Lang.AbsGrammer.DefinitionNamed happy_var_1 happy_var_3
|
||||
)}}
|
||||
|
||||
happyReduce_10 = happySpecReduce_1 5# happyReduction_10
|
||||
happyReduction_10 happy_x_1
|
||||
= case happyOut17 happy_x_1 of { (HappyWrap17 happy_var_1) ->
|
||||
happyIn9
|
||||
(Language.Lang.AbsGrammer.DefinitionAnonymous happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_11 = happySpecReduce_1 6# happyReduction_11
|
||||
happyReduction_11 happy_x_1
|
||||
= case happyOut4 happy_x_1 of { (HappyWrap4 happy_var_1) ->
|
||||
happyIn10
|
||||
(Language.Lang.AbsGrammer.TypeName happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_12 = happySpecReduce_2 6# happyReduction_12
|
||||
happyReduction_12 happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut10 happy_x_1 of { (HappyWrap10 happy_var_1) ->
|
||||
case happyOut10 happy_x_2 of { (HappyWrap10 happy_var_2) ->
|
||||
happyIn10
|
||||
(Language.Lang.AbsGrammer.TypeApplication happy_var_1 happy_var_2
|
||||
)}}
|
||||
|
||||
happyReduce_13 = happySpecReduce_3 6# happyReduction_13
|
||||
happyReduction_13 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut10 happy_x_1 of { (HappyWrap10 happy_var_1) ->
|
||||
case happyOut10 happy_x_3 of { (HappyWrap10 happy_var_3) ->
|
||||
happyIn10
|
||||
(Language.Lang.AbsGrammer.TypeAbstraction happy_var_1 happy_var_3
|
||||
)}}
|
||||
|
||||
happyReduce_14 = happySpecReduce_3 6# happyReduction_14
|
||||
happyReduction_14 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut13 happy_x_2 of { (HappyWrap13 happy_var_2) ->
|
||||
happyIn10
|
||||
(Language.Lang.AbsGrammer.TypeImplicit happy_var_2
|
||||
)}
|
||||
|
||||
happyReduce_15 = happySpecReduce_3 6# happyReduction_15
|
||||
happyReduction_15 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut13 happy_x_2 of { (HappyWrap13 happy_var_2) ->
|
||||
happyIn10
|
||||
(Language.Lang.AbsGrammer.TypeRecord happy_var_2
|
||||
)}
|
||||
|
||||
happyReduce_16 = happySpecReduce_3 6# happyReduction_16
|
||||
happyReduction_16 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut13 happy_x_2 of { (HappyWrap13 happy_var_2) ->
|
||||
happyIn10
|
||||
(Language.Lang.AbsGrammer.TypeAlternative happy_var_2
|
||||
)}
|
||||
|
||||
happyReduce_17 = happySpecReduce_3 6# happyReduction_17
|
||||
happyReduction_17 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut10 happy_x_2 of { (HappyWrap10 happy_var_2) ->
|
||||
happyIn10
|
||||
(Language.Lang.AbsGrammer.TypeParens happy_var_2
|
||||
)}
|
||||
|
||||
happyReduce_18 = happySpecReduce_1 7# happyReduction_18
|
||||
happyReduction_18 happy_x_1
|
||||
= case happyOut16 happy_x_1 of { (HappyWrap16 happy_var_1) ->
|
||||
happyIn11
|
||||
(Language.Lang.AbsGrammer.Pragma happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_19 = happySpecReduce_0 8# happyReduction_19
|
||||
happyReduction_19 = happyIn12
|
||||
([]
|
||||
)
|
||||
|
||||
happyReduce_20 = happySpecReduce_1 8# happyReduction_20
|
||||
happyReduction_20 happy_x_1
|
||||
= case happyOut7 happy_x_1 of { (HappyWrap7 happy_var_1) ->
|
||||
happyIn12
|
||||
((:[]) happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_21 = happySpecReduce_3 8# happyReduction_21
|
||||
happyReduction_21 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut7 happy_x_1 of { (HappyWrap7 happy_var_1) ->
|
||||
case happyOut12 happy_x_3 of { (HappyWrap12 happy_var_3) ->
|
||||
happyIn12
|
||||
((:) happy_var_1 happy_var_3
|
||||
)}}
|
||||
|
||||
happyReduce_22 = happySpecReduce_0 9# happyReduction_22
|
||||
happyReduction_22 = happyIn13
|
||||
([]
|
||||
)
|
||||
|
||||
happyReduce_23 = happySpecReduce_1 9# happyReduction_23
|
||||
happyReduction_23 happy_x_1
|
||||
= case happyOut8 happy_x_1 of { (HappyWrap8 happy_var_1) ->
|
||||
happyIn13
|
||||
((:[]) happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_24 = happySpecReduce_3 9# happyReduction_24
|
||||
happyReduction_24 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut8 happy_x_1 of { (HappyWrap8 happy_var_1) ->
|
||||
case happyOut13 happy_x_3 of { (HappyWrap13 happy_var_3) ->
|
||||
happyIn13
|
||||
((:) happy_var_1 happy_var_3
|
||||
)}}
|
||||
|
||||
happyReduce_25 = happySpecReduce_0 10# happyReduction_25
|
||||
happyReduction_25 = happyIn14
|
||||
([]
|
||||
)
|
||||
|
||||
happyReduce_26 = happySpecReduce_1 10# happyReduction_26
|
||||
happyReduction_26 happy_x_1
|
||||
= case happyOut9 happy_x_1 of { (HappyWrap9 happy_var_1) ->
|
||||
happyIn14
|
||||
((:[]) happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_27 = happySpecReduce_3 10# happyReduction_27
|
||||
happyReduction_27 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut9 happy_x_1 of { (HappyWrap9 happy_var_1) ->
|
||||
case happyOut14 happy_x_3 of { (HappyWrap14 happy_var_3) ->
|
||||
happyIn14
|
||||
((:) happy_var_1 happy_var_3
|
||||
)}}
|
||||
|
||||
happyReduce_28 = happySpecReduce_1 11# happyReduction_28
|
||||
happyReduction_28 happy_x_1
|
||||
= case happyOut10 happy_x_1 of { (HappyWrap10 happy_var_1) ->
|
||||
happyIn15
|
||||
((:[]) happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_29 = happySpecReduce_3 11# happyReduction_29
|
||||
happyReduction_29 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut10 happy_x_1 of { (HappyWrap10 happy_var_1) ->
|
||||
case happyOut15 happy_x_3 of { (HappyWrap15 happy_var_3) ->
|
||||
happyIn15
|
||||
((:) happy_var_1 happy_var_3
|
||||
)}}
|
||||
|
||||
happyReduce_30 = happySpecReduce_1 12# happyReduction_30
|
||||
happyReduction_30 happy_x_1
|
||||
= case happyOut4 happy_x_1 of { (HappyWrap4 happy_var_1) ->
|
||||
happyIn16
|
||||
((:[]) happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_31 = happySpecReduce_2 12# happyReduction_31
|
||||
happyReduction_31 happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut4 happy_x_1 of { (HappyWrap4 happy_var_1) ->
|
||||
case happyOut16 happy_x_2 of { (HappyWrap16 happy_var_2) ->
|
||||
happyIn16
|
||||
((:) happy_var_1 happy_var_2
|
||||
)}}
|
||||
|
||||
happyReduce_32 = happySpecReduce_1 13# happyReduction_32
|
||||
happyReduction_32 happy_x_1
|
||||
= case happyOut4 happy_x_1 of { (HappyWrap4 happy_var_1) ->
|
||||
happyIn17
|
||||
(Language.Lang.AbsGrammer.ExpressionName happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_33 = happySpecReduce_1 13# happyReduction_33
|
||||
happyReduction_33 happy_x_1
|
||||
= case happyOut5 happy_x_1 of { (HappyWrap5 happy_var_1) ->
|
||||
happyIn17
|
||||
(Language.Lang.AbsGrammer.ExpressionLiteral happy_var_1
|
||||
)}
|
||||
|
||||
happyReduce_34 = happySpecReduce_2 13# happyReduction_34
|
||||
happyReduction_34 happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut17 happy_x_1 of { (HappyWrap17 happy_var_1) ->
|
||||
case happyOut17 happy_x_2 of { (HappyWrap17 happy_var_2) ->
|
||||
happyIn17
|
||||
(Language.Lang.AbsGrammer.ExpressionApplication happy_var_1 happy_var_2
|
||||
)}}
|
||||
|
||||
happyReduce_35 = happySpecReduce_3 13# happyReduction_35
|
||||
happyReduction_35 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut17 happy_x_1 of { (HappyWrap17 happy_var_1) ->
|
||||
case happyOut17 happy_x_3 of { (HappyWrap17 happy_var_3) ->
|
||||
happyIn17
|
||||
(Language.Lang.AbsGrammer.ExpressionAbstraction happy_var_1 happy_var_3
|
||||
)}}
|
||||
|
||||
happyReduce_36 = happySpecReduce_3 13# happyReduction_36
|
||||
happyReduction_36 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut6 happy_x_2 of { (HappyWrap6 happy_var_2) ->
|
||||
happyIn17
|
||||
(Language.Lang.AbsGrammer.ExpressionImplicit happy_var_2
|
||||
)}
|
||||
|
||||
happyReduce_37 = happySpecReduce_3 13# happyReduction_37
|
||||
happyReduction_37 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut6 happy_x_2 of { (HappyWrap6 happy_var_2) ->
|
||||
happyIn17
|
||||
(Language.Lang.AbsGrammer.ExpressionRecord happy_var_2
|
||||
)}
|
||||
|
||||
happyReduce_38 = happySpecReduce_3 13# happyReduction_38
|
||||
happyReduction_38 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut6 happy_x_2 of { (HappyWrap6 happy_var_2) ->
|
||||
happyIn17
|
||||
(Language.Lang.AbsGrammer.ExpressionAlternative happy_var_2
|
||||
)}
|
||||
|
||||
happyReduce_39 = happySpecReduce_3 13# happyReduction_39
|
||||
happyReduction_39 happy_x_3
|
||||
happy_x_2
|
||||
happy_x_1
|
||||
= case happyOut17 happy_x_2 of { (HappyWrap17 happy_var_2) ->
|
||||
happyIn17
|
||||
(Language.Lang.AbsGrammer.ExpressionParens happy_var_2
|
||||
)}
|
||||
|
||||
happyNewToken action sts stk [] =
|
||||
happyDoAction 17# notHappyAtAll action sts stk []
|
||||
|
||||
happyNewToken action sts stk (tk:tks) =
|
||||
let cont i = happyDoAction i tk action sts stk tks in
|
||||
case tk of {
|
||||
PT _ (TS _ 1) -> cont 1#;
|
||||
PT _ (TS _ 2) -> cont 2#;
|
||||
PT _ (TS _ 3) -> cont 3#;
|
||||
PT _ (TS _ 4) -> cont 4#;
|
||||
PT _ (TS _ 5) -> cont 5#;
|
||||
PT _ (TS _ 6) -> cont 6#;
|
||||
PT _ (TS _ 7) -> cont 7#;
|
||||
PT _ (TS _ 8) -> cont 8#;
|
||||
PT _ (TS _ 9) -> cont 9#;
|
||||
PT _ (TS _ 10) -> cont 10#;
|
||||
PT _ (TS _ 11) -> cont 11#;
|
||||
PT _ (TS _ 12) -> cont 12#;
|
||||
PT _ (TS _ 13) -> cont 13#;
|
||||
PT _ (TS _ 14) -> cont 14#;
|
||||
PT _ (T_Name happy_dollar_dollar) -> cont 15#;
|
||||
PT _ (T_NumericLiteral happy_dollar_dollar) -> cont 16#;
|
||||
_ -> happyError' ((tk:tks), [])
|
||||
}
|
||||
|
||||
happyError_ explist 17# tk tks = happyError' (tks, explist)
|
||||
happyError_ explist _ tk tks = happyError' ((tk:tks), explist)
|
||||
|
||||
happyThen :: () => Either String a -> (a -> Either String b) -> Either String b
|
||||
happyThen = ((>>=))
|
||||
happyReturn :: () => a -> Either String a
|
||||
happyReturn = (return)
|
||||
happyThen1 m k tks = ((>>=)) m (\a -> k a tks)
|
||||
happyReturn1 :: () => a -> b -> Either String a
|
||||
happyReturn1 = \a tks -> (return) a
|
||||
happyError' :: () => ([(Token)], [String]) -> Either String a
|
||||
happyError' = (\(tokens, _) -> happyError tokens)
|
||||
pModule tks = happySomeParser where
|
||||
happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (let {(HappyWrap6 x') = happyOut6 x} in x'))
|
||||
|
||||
happySeq = happyDontSeq
|
||||
|
||||
|
||||
happyError :: [Token] -> Either String a
|
||||
happyError ts = Left $
|
||||
"syntax error at " ++ tokenPos ts ++
|
||||
case ts of
|
||||
[] -> []
|
||||
[Err _] -> " due to lexer error"
|
||||
t:_ -> " before `" ++ (prToken t) ++ "'"
|
||||
|
||||
myLexer = tokens
|
||||
{-# LINE 1 "templates/GenericTemplate.hs" #-}
|
||||
-- $Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp $
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
|
||||
#if __GLASGOW_HASKELL__ > 706
|
||||
#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)
|
||||
#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)
|
||||
#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)
|
||||
#else
|
||||
#define LT(n,m) (n Happy_GHC_Exts.<# m)
|
||||
#define GTE(n,m) (n Happy_GHC_Exts.>=# m)
|
||||
#define EQ(n,m) (n Happy_GHC_Exts.==# m)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
infixr 9 `HappyStk`
|
||||
data HappyStk a = HappyStk a (HappyStk a)
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- starting the parse
|
||||
|
||||
happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Accepting the parse
|
||||
|
||||
-- If the current token is ERROR_TOK, it means we've just accepted a partial
|
||||
-- parse (a %partial parser). We must ignore the saved token on the top of
|
||||
-- the stack in this case.
|
||||
happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
|
||||
happyReturn1 ans
|
||||
happyAccept j tk st sts (HappyStk ans _) =
|
||||
(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Arrays only: do the next action
|
||||
|
||||
|
||||
|
||||
happyDoAction i tk st
|
||||
= {- nothing -}
|
||||
case action of
|
||||
0# -> {- nothing -}
|
||||
happyFail (happyExpListPerState ((Happy_GHC_Exts.I# (st)) :: Int)) i tk st
|
||||
-1# -> {- nothing -}
|
||||
happyAccept i tk st
|
||||
n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
|
||||
(happyReduceArr Happy_Data_Array.! rule) i tk st
|
||||
where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
|
||||
n -> {- nothing -}
|
||||
happyShift new_state i tk st
|
||||
where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
|
||||
where off = happyAdjustOffset (indexShortOffAddr happyActOffsets st)
|
||||
off_i = (off Happy_GHC_Exts.+# i)
|
||||
check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))
|
||||
then EQ(indexShortOffAddr happyCheck off_i, i)
|
||||
else False
|
||||
action
|
||||
| check = indexShortOffAddr happyTable off_i
|
||||
| otherwise = indexShortOffAddr happyDefActions st
|
||||
|
||||
|
||||
|
||||
|
||||
indexShortOffAddr (HappyA# arr) off =
|
||||
Happy_GHC_Exts.narrow16Int# i
|
||||
where
|
||||
i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
|
||||
high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
|
||||
low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
|
||||
off' = off Happy_GHC_Exts.*# 2#
|
||||
|
||||
|
||||
|
||||
|
||||
{-# INLINE happyLt #-}
|
||||
happyLt x y = LT(x,y)
|
||||
|
||||
|
||||
readArrayBit arr bit =
|
||||
Bits.testBit (Happy_GHC_Exts.I# (indexShortOffAddr arr ((unbox_int bit) `Happy_GHC_Exts.iShiftRA#` 4#))) (bit `mod` 16)
|
||||
where unbox_int (Happy_GHC_Exts.I# x) = x
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- HappyState data type (not arrays)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Shifting a token
|
||||
|
||||
happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
|
||||
let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
|
||||
-- trace "shifting the error token" $
|
||||
happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
|
||||
|
||||
happyShift new_state i tk st sts stk =
|
||||
happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
|
||||
|
||||
-- happyReduce is specialised for the common cases.
|
||||
|
||||
happySpecReduce_0 i fn 0# tk st sts stk
|
||||
= happyFail [] 0# tk st sts stk
|
||||
happySpecReduce_0 nt fn j tk st@((action)) sts stk
|
||||
= happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
|
||||
|
||||
happySpecReduce_1 i fn 0# tk st sts stk
|
||||
= happyFail [] 0# tk st sts stk
|
||||
happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
|
||||
= let r = fn v1 in
|
||||
happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
|
||||
|
||||
happySpecReduce_2 i fn 0# tk st sts stk
|
||||
= happyFail [] 0# tk st sts stk
|
||||
happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
|
||||
= let r = fn v1 v2 in
|
||||
happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
|
||||
|
||||
happySpecReduce_3 i fn 0# tk st sts stk
|
||||
= happyFail [] 0# tk st sts stk
|
||||
happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
|
||||
= let r = fn v1 v2 v3 in
|
||||
happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
|
||||
|
||||
happyReduce k i fn 0# tk st sts stk
|
||||
= happyFail [] 0# tk st sts stk
|
||||
happyReduce k nt fn j tk st sts stk
|
||||
= case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
|
||||
sts1@((HappyCons (st1@(action)) (_))) ->
|
||||
let r = fn stk in -- it doesn't hurt to always seq here...
|
||||
happyDoSeq r (happyGoto nt j tk st1 sts1 r)
|
||||
|
||||
happyMonadReduce k nt fn 0# tk st sts stk
|
||||
= happyFail [] 0# tk st sts stk
|
||||
happyMonadReduce k nt fn j tk st sts stk =
|
||||
case happyDrop k (HappyCons (st) (sts)) of
|
||||
sts1@((HappyCons (st1@(action)) (_))) ->
|
||||
let drop_stk = happyDropStk k stk in
|
||||
happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
|
||||
|
||||
happyMonad2Reduce k nt fn 0# tk st sts stk
|
||||
= happyFail [] 0# tk st sts stk
|
||||
happyMonad2Reduce k nt fn j tk st sts stk =
|
||||
case happyDrop k (HappyCons (st) (sts)) of
|
||||
sts1@((HappyCons (st1@(action)) (_))) ->
|
||||
let drop_stk = happyDropStk k stk
|
||||
|
||||
off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st1)
|
||||
off_i = (off Happy_GHC_Exts.+# nt)
|
||||
new_state = indexShortOffAddr happyTable off_i
|
||||
|
||||
|
||||
|
||||
|
||||
in
|
||||
happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
|
||||
|
||||
happyDrop 0# l = l
|
||||
happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
|
||||
|
||||
happyDropStk 0# l = l
|
||||
happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Moving to a new state after a reduction
|
||||
|
||||
|
||||
happyGoto nt j tk st =
|
||||
{- nothing -}
|
||||
happyDoAction j tk new_state
|
||||
where off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st)
|
||||
off_i = (off Happy_GHC_Exts.+# nt)
|
||||
new_state = indexShortOffAddr happyTable off_i
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Error recovery (ERROR_TOK is the error token)
|
||||
|
||||
-- parse error if we are in recovery and we fail again
|
||||
happyFail explist 0# tk old_st _ stk@(x `HappyStk` _) =
|
||||
let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
|
||||
-- trace "failing" $
|
||||
happyError_ explist i tk
|
||||
|
||||
{- We don't need state discarding for our restricted implementation of
|
||||
"error". In fact, it can cause some bogus parses, so I've disabled it
|
||||
for now --SDM
|
||||
|
||||
-- discard a state
|
||||
happyFail ERROR_TOK tk old_st CONS(HAPPYSTATE(action),sts)
|
||||
(saved_tok `HappyStk` _ `HappyStk` stk) =
|
||||
-- trace ("discarding state, depth " ++ show (length stk)) $
|
||||
DO_ACTION(action,ERROR_TOK,tk,sts,(saved_tok`HappyStk`stk))
|
||||
-}
|
||||
|
||||
-- Enter error recovery: generate an error token,
|
||||
-- save the old token and carry on.
|
||||
happyFail explist i tk (action) sts stk =
|
||||
-- trace "entering error recovery" $
|
||||
happyDoAction 0# tk action sts ((Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
|
||||
|
||||
-- Internal happy errors:
|
||||
|
||||
notHappyAtAll :: a
|
||||
notHappyAtAll = error "Internal Happy error\n"
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Hack to get the typechecker to accept our action functions
|
||||
|
||||
|
||||
happyTcHack :: Happy_GHC_Exts.Int# -> a -> a
|
||||
happyTcHack x y = y
|
||||
{-# INLINE happyTcHack #-}
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Seq-ing. If the --strict flag is given, then Happy emits
|
||||
-- happySeq = happyDoSeq
|
||||
-- otherwise it emits
|
||||
-- happySeq = happyDontSeq
|
||||
|
||||
happyDoSeq, happyDontSeq :: a -> b -> b
|
||||
happyDoSeq a b = a `seq` b
|
||||
happyDontSeq a b = b
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Don't inline any functions from the template. GHC has a nasty habit
|
||||
-- of deciding to inline happyGoto everywhere, which increases the size of
|
||||
-- the generated parser quite a bit.
|
||||
|
||||
|
||||
{-# NOINLINE happyDoAction #-}
|
||||
{-# NOINLINE happyTable #-}
|
||||
{-# NOINLINE happyCheck #-}
|
||||
{-# NOINLINE happyActOffsets #-}
|
||||
{-# NOINLINE happyGotoOffsets #-}
|
||||
{-# NOINLINE happyDefActions #-}
|
||||
|
||||
{-# NOINLINE happyShift #-}
|
||||
{-# NOINLINE happySpecReduce_0 #-}
|
||||
{-# NOINLINE happySpecReduce_1 #-}
|
||||
{-# NOINLINE happySpecReduce_2 #-}
|
||||
{-# NOINLINE happySpecReduce_3 #-}
|
||||
{-# NOINLINE happyReduce #-}
|
||||
{-# NOINLINE happyMonadReduce #-}
|
||||
{-# NOINLINE happyGoto #-}
|
||||
{-# NOINLINE happyFail #-}
|
||||
|
||||
-- end of Happy Template.
|
1285
src/Language/Lang/ParGrammer.info
Normal file
1285
src/Language/Lang/ParGrammer.info
Normal file
File diff suppressed because it is too large
Load diff
109
src/Language/Lang/ParGrammer.y
Normal file
109
src/Language/Lang/ParGrammer.y
Normal file
|
@ -0,0 +1,109 @@
|
|||
-- This Happy file was machine-generated by the BNF converter
|
||||
{
|
||||
{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
|
||||
module Language.Lang.ParGrammer where
|
||||
import qualified Language.Lang.AbsGrammer
|
||||
import Language.Lang.LexGrammer
|
||||
}
|
||||
|
||||
%name pModule Module
|
||||
-- no lexer declaration
|
||||
%monad { Either String } { (>>=) } { return }
|
||||
%tokentype {Token}
|
||||
%token
|
||||
'#}' { PT _ (TS _ 1) }
|
||||
'(' { PT _ (TS _ 2) }
|
||||
')' { PT _ (TS _ 3) }
|
||||
',' { PT _ (TS _ 4) }
|
||||
'->' { PT _ (TS _ 5) }
|
||||
':' { PT _ (TS _ 6) }
|
||||
'=' { PT _ (TS _ 7) }
|
||||
'[' { PT _ (TS _ 8) }
|
||||
']' { PT _ (TS _ 9) }
|
||||
'{' { PT _ (TS _ 10) }
|
||||
'{#' { PT _ (TS _ 11) }
|
||||
'{{' { PT _ (TS _ 12) }
|
||||
'}' { PT _ (TS _ 13) }
|
||||
'}}' { PT _ (TS _ 14) }
|
||||
L_Name { PT _ (T_Name $$) }
|
||||
L_NumericLiteral { PT _ (T_NumericLiteral $$) }
|
||||
|
||||
%%
|
||||
|
||||
Name :: { Language.Lang.AbsGrammer.Name}
|
||||
Name : L_Name { Language.Lang.AbsGrammer.Name $1 }
|
||||
|
||||
NumericLiteral :: { Language.Lang.AbsGrammer.NumericLiteral}
|
||||
NumericLiteral : L_NumericLiteral { Language.Lang.AbsGrammer.NumericLiteral $1 }
|
||||
|
||||
Module :: { Language.Lang.AbsGrammer.Module }
|
||||
Module : ListBinding { Language.Lang.AbsGrammer.Module $1 }
|
||||
|
||||
Binding :: { Language.Lang.AbsGrammer.Binding }
|
||||
Binding : Declaration { Language.Lang.AbsGrammer.BindingDeclaration $1 }
|
||||
| Definition { Language.Lang.AbsGrammer.BindingDefinition $1 }
|
||||
| '{#' Pragma '#}' { Language.Lang.AbsGrammer.BindingPragma $2 }
|
||||
|
||||
Declaration :: { Language.Lang.AbsGrammer.Declaration }
|
||||
Declaration : Name ':' Type { Language.Lang.AbsGrammer.DeclarationNamed $1 $3 }
|
||||
| Type { Language.Lang.AbsGrammer.DeclarationAnonymous $1 }
|
||||
|
||||
Definition :: { Language.Lang.AbsGrammer.Definition }
|
||||
Definition : Name '=' Expression { Language.Lang.AbsGrammer.DefinitionNamed $1 $3 }
|
||||
| Expression { Language.Lang.AbsGrammer.DefinitionAnonymous $1 }
|
||||
|
||||
Type :: { Language.Lang.AbsGrammer.Type }
|
||||
Type : Name { Language.Lang.AbsGrammer.TypeName $1 }
|
||||
| Type Type { Language.Lang.AbsGrammer.TypeApplication $1 $2 }
|
||||
| Type '->' Type { Language.Lang.AbsGrammer.TypeAbstraction $1 $3 }
|
||||
| '{{' ListDeclaration '}}' { Language.Lang.AbsGrammer.TypeImplicit $2 }
|
||||
| '{' ListDeclaration '}' { Language.Lang.AbsGrammer.TypeRecord $2 }
|
||||
| '[' ListDeclaration ']' { Language.Lang.AbsGrammer.TypeAlternative $2 }
|
||||
| '(' Type ')' { Language.Lang.AbsGrammer.TypeParens $2 }
|
||||
|
||||
Pragma :: { Language.Lang.AbsGrammer.Pragma }
|
||||
Pragma : ListName { Language.Lang.AbsGrammer.Pragma $1 }
|
||||
|
||||
ListBinding :: { [Language.Lang.AbsGrammer.Binding] }
|
||||
ListBinding : {- empty -} { [] }
|
||||
| Binding { (:[]) $1 }
|
||||
| Binding ',' ListBinding { (:) $1 $3 }
|
||||
|
||||
ListDeclaration :: { [Language.Lang.AbsGrammer.Declaration] }
|
||||
ListDeclaration : {- empty -} { [] }
|
||||
| Declaration { (:[]) $1 }
|
||||
| Declaration ',' ListDeclaration { (:) $1 $3 }
|
||||
|
||||
ListDefinition :: { [Language.Lang.AbsGrammer.Definition] }
|
||||
ListDefinition : {- empty -} { [] }
|
||||
| Definition { (:[]) $1 }
|
||||
| Definition ',' ListDefinition { (:) $1 $3 }
|
||||
|
||||
ListType :: { [Language.Lang.AbsGrammer.Type] }
|
||||
ListType : Type { (:[]) $1 } | Type ',' ListType { (:) $1 $3 }
|
||||
|
||||
ListName :: { [Language.Lang.AbsGrammer.Name] }
|
||||
ListName : Name { (:[]) $1 } | Name ListName { (:) $1 $2 }
|
||||
|
||||
Expression :: { Language.Lang.AbsGrammer.Expression }
|
||||
Expression : Name { Language.Lang.AbsGrammer.ExpressionName $1 }
|
||||
| NumericLiteral { Language.Lang.AbsGrammer.ExpressionLiteral $1 }
|
||||
| Expression Expression { Language.Lang.AbsGrammer.ExpressionApplication $1 $2 }
|
||||
| Expression '->' Expression { Language.Lang.AbsGrammer.ExpressionAbstraction $1 $3 }
|
||||
| '{{' Module '}}' { Language.Lang.AbsGrammer.ExpressionImplicit $2 }
|
||||
| '{' Module '}' { Language.Lang.AbsGrammer.ExpressionRecord $2 }
|
||||
| '[' Module ']' { Language.Lang.AbsGrammer.ExpressionAlternative $2 }
|
||||
| '(' Expression ')' { Language.Lang.AbsGrammer.ExpressionParens $2 }
|
||||
{
|
||||
|
||||
happyError :: [Token] -> Either String a
|
||||
happyError ts = Left $
|
||||
"syntax error at " ++ tokenPos ts ++
|
||||
case ts of
|
||||
[] -> []
|
||||
[Err _] -> " due to lexer error"
|
||||
t:_ -> " before `" ++ (prToken t) ++ "'"
|
||||
|
||||
myLexer = tokens
|
||||
}
|
||||
|
178
src/Language/Lang/PrintGrammer.hs
Normal file
178
src/Language/Lang/PrintGrammer.hs
Normal file
|
@ -0,0 +1,178 @@
|
|||
{-# LANGUAGE CPP #-}
|
||||
#if __GLASGOW_HASKELL__ <= 708
|
||||
{-# LANGUAGE OverlappingInstances #-}
|
||||
#endif
|
||||
{-# LANGUAGE FlexibleInstances #-}
|
||||
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
|
||||
|
||||
-- | Pretty-printer for Language.
|
||||
-- Generated by the BNF converter.
|
||||
|
||||
module Language.Lang.PrintGrammer where
|
||||
|
||||
import qualified Language.Lang.AbsGrammer
|
||||
import Data.Char
|
||||
|
||||
-- | The top-level printing method.
|
||||
|
||||
printTree :: Print a => a -> String
|
||||
printTree = render . prt 0
|
||||
|
||||
type Doc = [ShowS] -> [ShowS]
|
||||
|
||||
doc :: ShowS -> Doc
|
||||
doc = (:)
|
||||
|
||||
render :: Doc -> String
|
||||
render d = rend 0 (map ($ "") $ d []) "" where
|
||||
rend i ss = case ss of
|
||||
"[" :ts -> showChar '[' . rend i ts
|
||||
"(" :ts -> showChar '(' . rend i ts
|
||||
"{" :ts -> showChar '{' . new (i+1) . rend (i+1) ts
|
||||
"}" : ";":ts -> new (i-1) . space "}" . showChar ';' . new (i-1) . rend (i-1) ts
|
||||
"}" :ts -> new (i-1) . showChar '}' . new (i-1) . rend (i-1) ts
|
||||
[";"] -> showChar ';'
|
||||
";" :ts -> showChar ';' . new i . rend i ts
|
||||
t : ts@(p:_) | closingOrPunctuation p -> showString t . rend i ts
|
||||
t :ts -> space t . rend i ts
|
||||
_ -> id
|
||||
new i = showChar '\n' . replicateS (2*i) (showChar ' ') . dropWhile isSpace
|
||||
space t s =
|
||||
case (all isSpace t', null spc, null rest) of
|
||||
(True , _ , True ) -> [] -- remove trailing space
|
||||
(False, _ , True ) -> t' -- remove trailing space
|
||||
(False, True, False) -> t' ++ ' ' : s -- add space if none
|
||||
_ -> t' ++ s
|
||||
where
|
||||
t' = showString t []
|
||||
(spc, rest) = span isSpace s
|
||||
|
||||
closingOrPunctuation :: String -> Bool
|
||||
closingOrPunctuation [c] = c `elem` closerOrPunct
|
||||
closingOrPunctuation _ = False
|
||||
|
||||
closerOrPunct :: String
|
||||
closerOrPunct = ")],;"
|
||||
|
||||
parenth :: Doc -> Doc
|
||||
parenth ss = doc (showChar '(') . ss . doc (showChar ')')
|
||||
|
||||
concatS :: [ShowS] -> ShowS
|
||||
concatS = foldr (.) id
|
||||
|
||||
concatD :: [Doc] -> Doc
|
||||
concatD = foldr (.) id
|
||||
|
||||
replicateS :: Int -> ShowS -> ShowS
|
||||
replicateS n f = concatS (replicate n f)
|
||||
|
||||
-- | The printer class does the job.
|
||||
|
||||
class Print a where
|
||||
prt :: Int -> a -> Doc
|
||||
prtList :: Int -> [a] -> Doc
|
||||
prtList i = concatD . map (prt i)
|
||||
|
||||
instance {-# OVERLAPPABLE #-} Print a => Print [a] where
|
||||
prt = prtList
|
||||
|
||||
instance Print Char where
|
||||
prt _ s = doc (showChar '\'' . mkEsc '\'' s . showChar '\'')
|
||||
prtList _ s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"')
|
||||
|
||||
mkEsc :: Char -> Char -> ShowS
|
||||
mkEsc q s = case s of
|
||||
_ | s == q -> showChar '\\' . showChar s
|
||||
'\\'-> showString "\\\\"
|
||||
'\n' -> showString "\\n"
|
||||
'\t' -> showString "\\t"
|
||||
_ -> showChar s
|
||||
|
||||
prPrec :: Int -> Int -> Doc -> Doc
|
||||
prPrec i j = if j < i then parenth else id
|
||||
|
||||
instance Print Integer where
|
||||
prt _ x = doc (shows x)
|
||||
|
||||
instance Print Double where
|
||||
prt _ x = doc (shows x)
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.Name where
|
||||
prt _ (Language.Lang.AbsGrammer.Name i) = doc $ showString $ i
|
||||
prtList _ [x] = concatD [prt 0 x, doc (showString " ")]
|
||||
prtList _ (x:xs) = concatD [prt 0 x, doc (showString " "), prt 0 xs]
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.NumericLiteral where
|
||||
prt _ (Language.Lang.AbsGrammer.NumericLiteral i) = doc $ showString $ i
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.Module where
|
||||
prt i e = case e of
|
||||
Language.Lang.AbsGrammer.Module bindings -> prPrec i 0 (concatD [prt 0 bindings])
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.Binding where
|
||||
prt i e = case e of
|
||||
Language.Lang.AbsGrammer.BindingDeclaration declaration -> prPrec i 0 (concatD [prt 0 declaration])
|
||||
Language.Lang.AbsGrammer.BindingDefinition definition -> prPrec i 0 (concatD [prt 0 definition])
|
||||
Language.Lang.AbsGrammer.BindingPragma pragma -> prPrec i 0 (concatD [doc (showString "{#"), prt 0 pragma, doc (showString "#}")])
|
||||
prtList _ [] = concatD []
|
||||
prtList _ [x] = concatD [prt 0 x]
|
||||
prtList _ (x:xs) = concatD [prt 0 x, doc (showString ","), prt 0 xs]
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.Declaration where
|
||||
prt i e = case e of
|
||||
Language.Lang.AbsGrammer.DeclarationNamed name type_ -> prPrec i 0 (concatD [prt 0 name, doc (showString ":"), prt 0 type_])
|
||||
Language.Lang.AbsGrammer.DeclarationAnonymous type_ -> prPrec i 0 (concatD [prt 0 type_])
|
||||
prtList _ [] = concatD []
|
||||
prtList _ [x] = concatD [prt 0 x]
|
||||
prtList _ (x:xs) = concatD [prt 0 x, doc (showString ","), prt 0 xs]
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.Definition where
|
||||
prt i e = case e of
|
||||
Language.Lang.AbsGrammer.DefinitionNamed name expression -> prPrec i 0 (concatD [prt 0 name, doc (showString "="), prt 0 expression])
|
||||
Language.Lang.AbsGrammer.DefinitionAnonymous expression -> prPrec i 0 (concatD [prt 0 expression])
|
||||
prtList _ [] = concatD []
|
||||
prtList _ [x] = concatD [prt 0 x]
|
||||
prtList _ (x:xs) = concatD [prt 0 x, doc (showString ","), prt 0 xs]
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.Type where
|
||||
prt i e = case e of
|
||||
Language.Lang.AbsGrammer.TypeName name -> prPrec i 0 (concatD [prt 0 name])
|
||||
Language.Lang.AbsGrammer.TypeApplication type_1 type_2 -> prPrec i 0 (concatD [prt 0 type_1, prt 0 type_2])
|
||||
Language.Lang.AbsGrammer.TypeAbstraction type_1 type_2 -> prPrec i 0 (concatD [prt 0 type_1, doc (showString "->"), prt 0 type_2])
|
||||
Language.Lang.AbsGrammer.TypeImplicit declarations -> prPrec i 0 (concatD [doc (showString "{{"), prt 0 declarations, doc (showString "}}")])
|
||||
Language.Lang.AbsGrammer.TypeRecord declarations -> prPrec i 0 (concatD [doc (showString "{"), prt 0 declarations, doc (showString "}")])
|
||||
Language.Lang.AbsGrammer.TypeAlternative declarations -> prPrec i 0 (concatD [doc (showString "["), prt 0 declarations, doc (showString "]")])
|
||||
Language.Lang.AbsGrammer.TypeParens type_ -> prPrec i 0 (concatD [doc (showString "("), prt 0 type_, doc (showString ")")])
|
||||
prtList _ [x] = concatD [prt 0 x]
|
||||
prtList _ (x:xs) = concatD [prt 0 x, doc (showString ","), prt 0 xs]
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.Pragma where
|
||||
prt i e = case e of
|
||||
Language.Lang.AbsGrammer.Pragma names -> prPrec i 0 (concatD [prt 0 names])
|
||||
|
||||
instance Print [Language.Lang.AbsGrammer.Binding] where
|
||||
prt = prtList
|
||||
|
||||
instance Print [Language.Lang.AbsGrammer.Declaration] where
|
||||
prt = prtList
|
||||
|
||||
instance Print [Language.Lang.AbsGrammer.Definition] where
|
||||
prt = prtList
|
||||
|
||||
instance Print [Language.Lang.AbsGrammer.Type] where
|
||||
prt = prtList
|
||||
|
||||
instance Print [Language.Lang.AbsGrammer.Name] where
|
||||
prt = prtList
|
||||
|
||||
instance Print Language.Lang.AbsGrammer.Expression where
|
||||
prt i e = case e of
|
||||
Language.Lang.AbsGrammer.ExpressionName name -> prPrec i 0 (concatD [prt 0 name])
|
||||
Language.Lang.AbsGrammer.ExpressionLiteral numericliteral -> prPrec i 0 (concatD [prt 0 numericliteral])
|
||||
Language.Lang.AbsGrammer.ExpressionApplication expression1 expression2 -> prPrec i 0 (concatD [prt 0 expression1, prt 0 expression2])
|
||||
Language.Lang.AbsGrammer.ExpressionAbstraction expression1 expression2 -> prPrec i 0 (concatD [prt 0 expression1, doc (showString "->"), prt 0 expression2])
|
||||
Language.Lang.AbsGrammer.ExpressionImplicit module_ -> prPrec i 0 (concatD [doc (showString "{{"), prt 0 module_, doc (showString "}}")])
|
||||
Language.Lang.AbsGrammer.ExpressionRecord module_ -> prPrec i 0 (concatD [doc (showString "{"), prt 0 module_, doc (showString "}")])
|
||||
Language.Lang.AbsGrammer.ExpressionAlternative module_ -> prPrec i 0 (concatD [doc (showString "["), prt 0 module_, doc (showString "]")])
|
||||
Language.Lang.AbsGrammer.ExpressionParens expression -> prPrec i 0 (concatD [doc (showString "("), prt 0 expression, doc (showString ")")])
|
||||
|
57
src/Language/Lang/SkelGrammer.hs
Normal file
57
src/Language/Lang/SkelGrammer.hs
Normal file
|
@ -0,0 +1,57 @@
|
|||
-- Haskell module generated by the BNF converter
|
||||
|
||||
module Language.Lang.SkelGrammer where
|
||||
|
||||
import qualified Language.Lang.AbsGrammer
|
||||
|
||||
type Err = Either String
|
||||
type Result = Err String
|
||||
|
||||
failure :: Show a => a -> Result
|
||||
failure x = Left $ "Undefined case: " ++ show x
|
||||
|
||||
transName :: Language.Lang.AbsGrammer.Name -> Result
|
||||
transName x = case x of
|
||||
Language.Lang.AbsGrammer.Name string -> failure x
|
||||
transNumericLiteral :: Language.Lang.AbsGrammer.NumericLiteral -> Result
|
||||
transNumericLiteral x = case x of
|
||||
Language.Lang.AbsGrammer.NumericLiteral string -> failure x
|
||||
transModule :: Language.Lang.AbsGrammer.Module -> Result
|
||||
transModule x = case x of
|
||||
Language.Lang.AbsGrammer.Module bindings -> failure x
|
||||
transBinding :: Language.Lang.AbsGrammer.Binding -> Result
|
||||
transBinding x = case x of
|
||||
Language.Lang.AbsGrammer.BindingDeclaration declaration -> failure x
|
||||
Language.Lang.AbsGrammer.BindingDefinition definition -> failure x
|
||||
Language.Lang.AbsGrammer.BindingPragma pragma -> failure x
|
||||
transDeclaration :: Language.Lang.AbsGrammer.Declaration -> Result
|
||||
transDeclaration x = case x of
|
||||
Language.Lang.AbsGrammer.DeclarationNamed name type_ -> failure x
|
||||
Language.Lang.AbsGrammer.DeclarationAnonymous type_ -> failure x
|
||||
transDefinition :: Language.Lang.AbsGrammer.Definition -> Result
|
||||
transDefinition x = case x of
|
||||
Language.Lang.AbsGrammer.DefinitionNamed name expression -> failure x
|
||||
Language.Lang.AbsGrammer.DefinitionAnonymous expression -> failure x
|
||||
transType :: Language.Lang.AbsGrammer.Type -> Result
|
||||
transType x = case x of
|
||||
Language.Lang.AbsGrammer.TypeName name -> failure x
|
||||
Language.Lang.AbsGrammer.TypeApplication type_1 type_2 -> failure x
|
||||
Language.Lang.AbsGrammer.TypeAbstraction type_1 type_2 -> failure x
|
||||
Language.Lang.AbsGrammer.TypeImplicit declarations -> failure x
|
||||
Language.Lang.AbsGrammer.TypeRecord declarations -> failure x
|
||||
Language.Lang.AbsGrammer.TypeAlternative declarations -> failure x
|
||||
Language.Lang.AbsGrammer.TypeParens type_ -> failure x
|
||||
transPragma :: Language.Lang.AbsGrammer.Pragma -> Result
|
||||
transPragma x = case x of
|
||||
Language.Lang.AbsGrammer.Pragma names -> failure x
|
||||
transExpression :: Language.Lang.AbsGrammer.Expression -> Result
|
||||
transExpression x = case x of
|
||||
Language.Lang.AbsGrammer.ExpressionName name -> failure x
|
||||
Language.Lang.AbsGrammer.ExpressionLiteral numericliteral -> failure x
|
||||
Language.Lang.AbsGrammer.ExpressionApplication expression1 expression2 -> failure x
|
||||
Language.Lang.AbsGrammer.ExpressionAbstraction expression1 expression2 -> failure x
|
||||
Language.Lang.AbsGrammer.ExpressionImplicit module_ -> failure x
|
||||
Language.Lang.AbsGrammer.ExpressionRecord module_ -> failure x
|
||||
Language.Lang.AbsGrammer.ExpressionAlternative module_ -> failure x
|
||||
Language.Lang.AbsGrammer.ExpressionParens expression -> failure x
|
||||
|
70
src/Language/Lang/TestGrammer.hs
Normal file
70
src/Language/Lang/TestGrammer.hs
Normal file
|
@ -0,0 +1,70 @@
|
|||
-- Program to test parser, automatically generated by BNF Converter.
|
||||
|
||||
module Main where
|
||||
|
||||
import System.Environment ( getArgs, getProgName )
|
||||
import System.Exit ( exitFailure, exitSuccess )
|
||||
import Control.Monad ( when )
|
||||
|
||||
import Language.Lang.LexGrammer ( Token )
|
||||
import Language.Lang.ParGrammer ( pModule, myLexer )
|
||||
import Language.Lang.SkelGrammer ()
|
||||
import Language.Lang.PrintGrammer ( Print, printTree )
|
||||
import Language.Lang.AbsGrammer ()
|
||||
|
||||
type Err = Either String
|
||||
type ParseFun a = [Token] -> Err a
|
||||
|
||||
myLLexer = myLexer
|
||||
|
||||
type Verbosity = Int
|
||||
|
||||
putStrV :: Verbosity -> String -> IO ()
|
||||
putStrV v s = when (v > 1) $ putStrLn s
|
||||
|
||||
runFile :: (Print a, Show a) => Verbosity -> ParseFun a -> FilePath -> IO ()
|
||||
runFile v p f = putStrLn f >> readFile f >>= run v p
|
||||
|
||||
run :: (Print a, Show a) => Verbosity -> ParseFun a -> String -> IO ()
|
||||
run v p s = case p ts of
|
||||
Left s -> do
|
||||
putStrLn "\nParse Failed...\n"
|
||||
putStrV v "Tokens:"
|
||||
putStrV v $ show ts
|
||||
putStrLn s
|
||||
exitFailure
|
||||
Right tree -> do
|
||||
putStrLn "\nParse Successful!"
|
||||
showTree v tree
|
||||
|
||||
exitSuccess
|
||||
where
|
||||
ts = myLLexer s
|
||||
|
||||
|
||||
showTree :: (Show a, Print a) => Int -> a -> IO ()
|
||||
showTree v tree
|
||||
= do
|
||||
putStrV v $ "\n[Abstract Syntax]\n\n" ++ show tree
|
||||
putStrV v $ "\n[Linearized tree]\n\n" ++ printTree tree
|
||||
|
||||
usage :: IO ()
|
||||
usage = do
|
||||
putStrLn $ unlines
|
||||
[ "usage: Call with one of the following argument combinations:"
|
||||
, " --help Display this help message."
|
||||
, " (no arguments) Parse stdin verbosely."
|
||||
, " (files) Parse content of files verbosely."
|
||||
, " -s (files) Silent mode. Parse content of files silently."
|
||||
]
|
||||
exitFailure
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
args <- getArgs
|
||||
case args of
|
||||
["--help"] -> usage
|
||||
[] -> getContents >>= run 2 pModule
|
||||
"-s":fs -> mapM_ (runFile 0 pModule) fs
|
||||
fs -> mapM_ (runFile 2 pModule) fs
|
||||
|
31
src/Makefile
Normal file
31
src/Makefile
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Makefile generated by BNFC.
|
||||
|
||||
# List of goals not corresponding to file names.
|
||||
|
||||
.PHONY : all clean distclean
|
||||
|
||||
# Default goal.
|
||||
|
||||
all : Language/Lang/TestGrammer
|
||||
|
||||
# Rules for building the parser.
|
||||
|
||||
%.hs : %.y
|
||||
happy --ghc --coerce --array --info $<
|
||||
|
||||
%.hs : %.x
|
||||
alex --ghc $<
|
||||
|
||||
Language/Lang/TestGrammer : Language/Lang/TestGrammer.hs Language/Lang/ErrM.hs Language/Lang/LexGrammer.hs Language/Lang/ParGrammer.hs Language/Lang/PrintGrammer.hs
|
||||
ghc --make $< -o $@
|
||||
|
||||
# Rules for cleaning generated files.
|
||||
|
||||
clean :
|
||||
-rm -f Language/Lang/*.hi Language/Lang/*.o Language/Lang/*.log Language/Lang/*.aux Language/Lang/*.dvi
|
||||
|
||||
distclean : clean
|
||||
-rm -f Language/Lang/AbsGrammer.hs Language/Lang/AbsGrammer.hs.bak Language/Lang/ComposOp.hs Language/Lang/ComposOp.hs.bak Language/Lang/DocGrammer.txt Language/Lang/DocGrammer.txt.bak Language/Lang/ErrM.hs Language/Lang/ErrM.hs.bak Language/Lang/LayoutGrammer.hs Language/Lang/LayoutGrammer.hs.bak Language/Lang/LexGrammer.x Language/Lang/LexGrammer.x.bak Language/Lang/ParGrammer.y Language/Lang/ParGrammer.y.bak Language/Lang/PrintGrammer.hs Language/Lang/PrintGrammer.hs.bak Language/Lang/SharedString.hs Language/Lang/SharedString.hs.bak Language/Lang/SkelGrammer.hs Language/Lang/SkelGrammer.hs.bak Language/Lang/TestGrammer.hs Language/Lang/TestGrammer.hs.bak Language/Lang/XMLGrammer.hs Language/Lang/XMLGrammer.hs.bak Language/Lang/ASTGrammer.agda Language/Lang/ASTGrammer.agda.bak Language/Lang/ParserGrammer.agda Language/Lang/ParserGrammer.agda.bak Language/Lang/IOLib.agda Language/Lang/IOLib.agda.bak Language/Lang/Main.agda Language/Lang/Main.agda.bak Language/Lang/grammer.dtd Language/Lang/grammer.dtd.bak Language/Lang/TestGrammer Language/Lang/LexGrammer.hs Language/Lang/ParGrammer.hs Language/Lang/ParGrammer.info Language/Lang/ParDataGrammer.hs Makefile
|
||||
-rmdir -p Language/Lang/
|
||||
|
||||
# EOF
|
Loading…
Reference in a new issue