mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-22 19:22:50 -06:00
report
This commit is contained in:
@@ -1,16 +1,46 @@
|
||||
resource ResImper = open Prelude, Precedence in {
|
||||
resource ResImper = {
|
||||
|
||||
-- precedence
|
||||
|
||||
param
|
||||
Prec = P0 | P1 | P2 | P3 ;
|
||||
oper
|
||||
PrecExp : Type = {s : PrecTerm} ;
|
||||
continue : Str -> SS -> SS = \s -> infixSS ";" (ss s);
|
||||
statement : Str -> SS = \s -> postfixSS ";" (ss s);
|
||||
ex : PrecExp -> Str = \exp -> exp.s ! p0 ;
|
||||
infixL : Prec -> Str -> PrecExp -> PrecExp -> PrecExp =
|
||||
\p,h,x,y -> {s = mkInfixL h p x.s y.s} ;
|
||||
infixN : Prec -> Str -> PrecExp -> PrecExp -> PrecExp =
|
||||
\p,h,x,y -> {s = mkInfix h p x.s y.s} ;
|
||||
PrecExp : Type = {s : Prec => Str} ;
|
||||
ex : PrecExp -> Str = \exp -> exp.s ! P0 ;
|
||||
constant : Str -> PrecExp = \c -> {s = \\_ => c} ;
|
||||
infixN : Prec -> Str -> PrecExp -> PrecExp -> PrecExp = \p,f,x,y ->
|
||||
{s = \\k => mkPrec (x.s ! (nextPrec ! p) ++ f ++ y.s ! (nextPrec ! p)) ! p ! k} ;
|
||||
infixL : Prec -> Str -> PrecExp -> PrecExp -> PrecExp = \p,f,x,y ->
|
||||
{s = mkPrec (x.s ! p ++ f ++ y.s ! (nextPrec ! p)) ! p} ;
|
||||
|
||||
constant : Str -> PrecExp = \c -> {s = mkConst c} ;
|
||||
nextPrec : Prec => Prec = table {P0 => P1 ; P1 => P2 ; _ => P3} ;
|
||||
mkPrec : Str -> Prec => Prec => Str = \str -> table {
|
||||
P3 => table { -- use the term of precedence P3...
|
||||
_ => str} ; -- ...always without parentheses
|
||||
P2 => table { -- use the term of precedence P2...
|
||||
P3 => paren str ; -- ...in parentheses if P3 is expected...
|
||||
_ => str} ; -- ...otherwise without parentheses
|
||||
P1 => table {
|
||||
P3 | P2 => paren str ;
|
||||
_ => str} ;
|
||||
P0 => table {
|
||||
P0 => str ;
|
||||
_ => paren str}
|
||||
} ;
|
||||
|
||||
-- string operations
|
||||
|
||||
SS : Type = {s : Str} ;
|
||||
ss : Str -> SS = \s -> {s = s} ;
|
||||
cc2 : (_,_ : SS) -> SS = \x,y -> ss (x.s ++ y.s) ;
|
||||
|
||||
paren : Str -> Str = \str -> "(" ++ str ++ ")" ;
|
||||
|
||||
continues : Str -> SS -> SS = \s,t -> ss (s ++ ";" ++ t.s) ;
|
||||
continue : Str -> SS -> SS = \s,t -> ss (s ++ t.s) ;
|
||||
statement : Str -> SS = \s -> ss (s ++ ";");
|
||||
|
||||
-- taking cases of list size
|
||||
|
||||
param
|
||||
Size = Zero | One | More ;
|
||||
@@ -24,11 +54,17 @@ resource ResImper = open Prelude, Precedence in {
|
||||
_ => t
|
||||
} ;
|
||||
|
||||
-- for JVM
|
||||
Instr : Type = {s, s3 : Str} ; -- code, labels
|
||||
instr : Str -> Instr = \s -> statement s ** {s3 = []} ; ----
|
||||
instrc : Str -> Instr -> Instr = \s,i -> statement (s ++ i.s) ** {s3 = i.s3} ; ----
|
||||
-- operations for JVM
|
||||
|
||||
Instr : Type = {s,s2,s3 : Str} ; -- code, variables, labels
|
||||
instr : Str -> Instr = \s ->
|
||||
statement s ** {s2,s3 = []} ;
|
||||
instrc : Str -> Instr -> Instr = \s,i ->
|
||||
ss (s ++ ";" ++ i.s) ** {s2 = i.s2 ; s3 = i.s3} ;
|
||||
instrl : Str -> Instr -> Instr = \s,i ->
|
||||
ss (s ++ ";" ++ i.s) ** {s2 = i.s2 ; s3 = "L" ++ i.s3} ;
|
||||
instrb : Str -> Str -> Instr -> Instr = \v,s,i ->
|
||||
ss (s ++ ";" ++ i.s) ** {s2 = v ++ i.s2 ; s3 = i.s3} ;
|
||||
binop : Str -> SS -> SS -> SS = \op, x, y ->
|
||||
ss (x.s ++ y.s ++ op ++ ";") ;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user