Skip to content

Commit

Permalink
Worked some more static expression analysis.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@238 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
x97davka committed Mar 31, 1998
1 parent 643deb8 commit 7c7fb10
Show file tree
Hide file tree
Showing 8 changed files with 191 additions and 228 deletions.
16 changes: 8 additions & 8 deletions modeq/ast/modgram.g
Expand Up @@ -686,7 +686,7 @@ primary : << bool is_matrix; >>
| f:FALS/*E*/ << #f->rml = Exp__BOOL(RML_FALSE); >>
| t:TRU/*E*/ << #t->rml = Exp__BOOL(RML_TRUE); >>
| (name_path_function_arguments)?
| (member_list)?
/* | (member_list)? */
| i:component_reference << #0->rml = Exp__CREF(#i->rml); >>
| TIME << #0->rml = Exp__TIME; >>
| s:STRING << #s->rml = Exp__STRING(mk_scon($s.u.stringval)); >>
Expand All @@ -709,14 +709,14 @@ name_path : << bool qualified = false; >>
#0->rml = Exp__IDENT(mk_scon($i.u.stringval)); >>
;

member_list:
comp_ref { dot:DOT^
( (member_list)? | name_path ) }
;
/* member_list: */
/* comp_ref { dot:DOT^ */
/* ( (member_list)? | name_path ) } */
/* ; */

comp_ref:
name_path b:LBRACK^ subscript_list RBRACK!
;
/* comp_ref: */
/* name_path b:LBRACK^ subscript_list RBRACK! */
/* ; */

component_reference : << void *tail = NULL; >>
i:IDENT^ { a:subscripts }
Expand Down
76 changes: 35 additions & 41 deletions modeq/builtin.rml
Expand Up @@ -20,17 +20,17 @@ with "types.rml"
with "mod.rml"
with "classinf.rml"

val rl_type = Explode.CLASS("RealType",false,ClassInf.R_PREDEFINED,
val rl_type = Explode.CLASS("RealType",false,ClassInf.R_PREDEFINED_REAL,
Explode.PARTS([],[],[]))
val int_type = Explode.CLASS("IntegerType",false,ClassInf.R_PREDEFINED,
val int_type = Explode.CLASS("IntegerType",false,ClassInf.R_PREDEFINED_INT,
Explode.PARTS([],[],[]))
val str_type = Explode.CLASS("StringType",false,ClassInf.R_PREDEFINED,
val str_type = Explode.CLASS("StringType",false,ClassInf.R_PREDEFINED_STRING,
Explode.PARTS([],[],[]))
val bool_type = Explode.CLASS("BooleanType",false,ClassInf.R_PREDEFINED,
val bool_type = Explode.CLASS("BooleanType",false,ClassInf.R_PREDEFINED_BOOL,
Explode.PARTS([],[],[]))

val real_type =
Explode.CLASS("Real",false,ClassInf.R_PREDEFINED,
Explode.CLASS("Real",false,ClassInf.R_PREDEFINED_REAL,
Explode.PARTS
([Explode.ELEMENT(true,
false,
Expand All @@ -55,39 +55,33 @@ Explode.CLASS("Real",false,ClassInf.R_PREDEFINED,
[],
[]))

(*
val integer_type = Absyn.CLASS("Integer",false,ClassInf.R_PREDEFINED,
Absyn.PARTS(
[Absyn.PUBLIC(
[Absyn.ELEMENT(true,"value",
Absyn.COMPONENTS(false, true, false,
false, false,
Exp.IDENT("IntegerType"),
[Absyn.COMPONENT("value",
NONE,
NONE)])),
Absyn.ELEMENT(true,"quantity",
Absyn.COMPONENTS(false, true, false,
false, false,
Exp.IDENT("StringType"),
[Absyn.COMPONENT("quantity",
NONE,
NONE)])),
Absyn.ELEMENT(true,"unit",
Absyn.COMPONENTS(false, true, false,
false, false,
Exp.IDENT("StringType"),
[Absyn.COMPONENT("unit",
NONE,
NONE)])),
Absyn.ELEMENT(true,"displayUnit",
Absyn.COMPONENTS(false, true, false,
false, false,
Exp.IDENT("StringType"),
[Absyn.COMPONENT("displayUnit",
NONE,
NONE)]))])]))
val integer_type =
Explode.CLASS("Integer",false,ClassInf.R_PREDEFINED_INT,
Explode.PARTS
([Explode.ELEMENT(true,
false,
"value",
Explode.COMPONENT("value",
Types.ATTR(Types.NODIM,
false,
Types.VAR,
Types.BIDIR),
Exp.IDENT("IntegerType"),
Mod.NOMOD)),
(* quantity *)
Explode.ELEMENT(true,false,"unit",
Explode.COMPONENT("unit",
Types.ATTR(Types.NODIM,
false,
Types.VAR,
Types.BIDIR),
Exp.IDENT("StringType"),
Mod.NOMOD))],
(* displayUnit *)
[],
[]))

(*
val string_type = Absyn.CLASS("String",false,ClassInf.R_PREDEFINED,
Absyn.PARTS(
[Absyn.PUBLIC(
Expand All @@ -106,10 +100,10 @@ relation initial_env =
Env.extend_frame_c(env', int_type, Mod.NOMOD) => env'' &
Env.extend_frame_c(env'', str_type, Mod.NOMOD) => env''' &
Env.extend_frame_c(env''', bool_type, Mod.NOMOD) => env'''' &
Env.extend_frame_c(env'''', real_type, Mod.NOMOD) => env'''''
(* Env.extend_frame_c(env, integer_type) => env''''' &
Env.extend_frame_c(env, string_type) => env'''''' *)
Env.extend_frame_c(env'''', real_type, Mod.NOMOD) => env''''' &
Env.extend_frame_c(env''''', integer_type, Mod.NOMOD) => env''''''
(* Env.extend_frame_c(env, string_type) => env'''''' *)
----------------------------------------------
initial_env () => env'''''
initial_env () => env''''''

end
58 changes: 49 additions & 9 deletions modeq/classinf.rml
Expand Up @@ -20,7 +20,10 @@ module ClassInf :
| R_TYPE
| R_PACKAGE
| R_FUNCTION
| R_PREDEFINED (* For internal use only *)
| R_PREDEFINED_INT (* For internal use only *)
| R_PREDEFINED_REAL
| R_PREDEFINED_STRING
| R_PREDEFINED_BOOL

datatype State = UNKNOWN of string
| MODEL of string
Expand All @@ -30,14 +33,18 @@ module ClassInf :
| TYPE of string
| PACKAGE of string
| FUNCTION of string
| PREDEFINED of string
| HAS_EQUATIONS of string
| IS_NEW of string
| TYPE_INTEGER of string
| TYPE_REAL of string
| TYPE_STRING of string
| TYPE_BOOL of string

datatype Event = FOUND_EQUATION (* There are definitions *)
| NEWDEF (* This is not a derived class *)

relation print_restr : Restriction => ()
relation print_state : State => ()
relation start : (Restriction, string) => State
relation trans : (State, Event) => State
relation valid : (State, Restriction) => ()
Expand Down Expand Up @@ -79,9 +86,21 @@ relation print_restr : Restriction => () =
----------------
print_restr R_FUNCTION

rule print "PREDEFINED"
rule print "PREDEFINED_INT"
----------------
print_restr R_PREDEFINED
print_restr R_PREDEFINED_INT

rule print "PREDEFINED_REAL"
----------------
print_restr R_PREDEFINED_REAL

rule print "PREDEFINED_STRING"
----------------
print_restr R_PREDEFINED_STRING

rule print "PREDEFINED_BOOL"
----------------
print_restr R_PREDEFINED_BOOL

end

Expand Down Expand Up @@ -119,9 +138,21 @@ relation print_state : State => () =
----------------------------
print_state FUNCTION(s)

rule print "PREDEFINED " & print s
rule print "TYPE_INTEGER " & print s
----------------------------
print_state TYPE_INTEGER(s)

rule print "TYPE_REAL " & print s
----------------------------
print_state TYPE_REAL(s)

rule print "TYPE_STRING " & print s
----------------------------
print_state TYPE_STRING(s)

rule print "TYPE_BOOL " & print s
----------------------------
print_state PREDEFINED(s)
print_state TYPE_BOOL(s)

rule print "IS_NEW " & print s
----------------------------
Expand All @@ -143,7 +174,10 @@ relation start : (Restriction, string) => State =
axiom start (R_TYPE, s) => TYPE(s)
axiom start (R_PACKAGE, s) => PACKAGE(s)
axiom start (R_FUNCTION, s) => FUNCTION(s)
axiom start (R_PREDEFINED, s) => PREDEFINED(s)
axiom start (R_PREDEFINED_INT, s) => TYPE_INTEGER(s)
axiom start (R_PREDEFINED_REAL, s) => TYPE_REAL(s)
axiom start (R_PREDEFINED_STRING, s) => TYPE_STRING(s)
axiom start (R_PREDEFINED_BOOL, s) => TYPE_BOOL(s)

end

Expand All @@ -164,7 +198,10 @@ relation trans : (State, Event) => State =

axiom trans(PACKAGE(s), NEWDEF) => PACKAGE(s)
axiom trans(FUNCTION(s), NEWDEF) => FUNCTION(s)
axiom trans(PREDEFINED(s), NEWDEF) => PREDEFINED(s)
axiom trans(TYPE_INTEGER(s), NEWDEF) => TYPE_INTEGER(s)
axiom trans(TYPE_REAL(s), NEWDEF) => TYPE_REAL(s)
axiom trans(TYPE_STRING(s), NEWDEF) => TYPE_STRING(s)
axiom trans(TYPE_BOOL(s), NEWDEF) => TYPE_BOOL(s)

(* FOUND_EQUATION *)

Expand Down Expand Up @@ -216,7 +253,10 @@ relation valid : (State, Restriction) => () =
axiom valid(IS_NEW(s), R_CONNECTOR)

axiom valid(TYPE(s), R_TYPE)
axiom valid(PREDEFINED(s), R_TYPE)
axiom valid(TYPE_INTEGER(s), R_TYPE)
axiom valid(TYPE_REAL(s), R_TYPE)
axiom valid(TYPE_STRING(s), R_TYPE)
axiom valid(TYPE_BOOL(s), R_TYPE)

axiom valid(IS_NEW(s), R_PACKAGE)
axiom valid(PACKAGE(s), R_PACKAGE)
Expand Down
22 changes: 11 additions & 11 deletions modeq/env.rml
Expand Up @@ -33,7 +33,7 @@ module Env:
relation extend_frame_v : (Env, FrameVar) => Env
relation lookup_class : (Env, Exp.Path) => (Explode.Class, Mod.Mod)
relation lookup_var : (Env,Explode.ComponentRef)
=> (Types.VarAttr,Types.Type)
=> (Types.VarAttr,Types.Type,Exp.Exp option)
relation lookup_var_local : (Env, Explode.Ident) => FrameVar

end
Expand Down Expand Up @@ -155,35 +155,35 @@ relation lookup_in_var: (Types.Type, Explode.ComponentRef)
end

relation lookup_var_f : ((Explode.Ident * FrameVar) list, Explode.ComponentRef)
=> (Types.VarAttr, Types.Type) =
=> (Types.VarAttr, Types.Type, Exp.Exp option) =

rule (* print " lookup_var_f 1: " & print id & print "\n" & *)
lookup_var2(f, id) => FRAMEVAR(n,Types.ATTR(ad,f,vt,di),ty,_) &
lookup_var2(f, id) => FRAMEVAR(n,Types.ATTR(ad,f,vt,di),ty,ass) &
check_subscripts(ad,ss)
----------------------------------
lookup_var_f(f,[(id,ss)]) => (Types.ATTR(Types.NODIM,f,vt,di),ty)
lookup_var_f(f,[(id,ss)]) => (Types.ATTR(Types.NODIM,f,vt,di),ty,ass)

rule (* print " lookup_var_f 2: " & print id & print "\n" & *)
lookup_var2(f, id) => FRAMEVAR(n,Types.ATTR(ad,_,_,_),ty,_) &
lookup_var2(f, id) => FRAMEVAR(n,Types.ATTR(ad,_,_,_),ty,ass) &
check_subscripts(ad,ss) &
lookup_in_var(ty, ids) => (attr,ty)
----------------------------------
lookup_var_f(f,(id,ss)::ids) => (attr,ty)
lookup_var_f(f,(id,ss)::ids) => (attr,ty,ass)

end

relation lookup_var: (Env,Explode.ComponentRef)
=> (Types.VarAttr,Types.Type) =
=> (Types.VarAttr, Types.Type, Exp.Exp option) =

rule (* print " lookup_var: looking in frame\n" & *)
lookup_var_f(vs,ref) => (attr,ty)
lookup_var_f(vs,ref) => (attr,ty,ass)
-------------------------
lookup_var(FRAME(vs,_)::fs,ref) => (attr,ty)
lookup_var(FRAME(vs,_)::fs,ref) => (attr,ty,ass)

rule (* print " lookup_var: next frame\n" & *)
lookup_var(fs,ref) => (attr,ty)
lookup_var(fs,ref) => (attr,ty,ass)
--------------------
lookup_var(_::fs,ref) => (attr,ty)
lookup_var(_::fs,ref) => (attr,ty,ass)

end

Expand Down

0 comments on commit 7c7fb10

Please sign in to comment.