Skip to content

Commit

Permalink
- updated parser/AST to handle the annotation at the end of the exten…
Browse files Browse the repository at this point in the history
…ds clause:

  extends name [class_name] [annotation] 


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@4089 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adrpo committed Jun 18, 2009
1 parent 879bb91 commit d58761f
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 27 deletions.
1 change: 1 addition & 0 deletions Compiler/Absyn.mo
Expand Up @@ -352,6 +352,7 @@ uniontype ElementSpec "An element is something that occurs in a public or protec
record EXTENDS
Path path "path" ;
list<ElementArg> elementArg "elementArg" ;
Option<Annotation> annotationOpt "optional annotation";
end EXTENDS;

record IMPORT
Expand Down
15 changes: 15 additions & 0 deletions Compiler/Ceval.mo
Expand Up @@ -4415,6 +4415,21 @@ algorithm
then
(cache,Values.INTEGER(len),st_1);

// adrpo 2009-06-08: it doen't need to be a builtin type as long as the dimension is an integer!
case (cache,env,Exp.ARRAY(array = (e :: es)),dim,impl,st,msg)
local
Exp.Type tp;
Exp.Exp dim;
equation
tp = Exp.typeof(e) "Special case for array expressions with nonconstant values
For now: only arrays of scalar elements:
TODO generalize to arbitrary dimensions" ;
false = Exp.typeBuiltin(tp);
(cache,Values.INTEGER(1),st_1) = ceval(cache,env, dim, impl, st, NONE, msg);
len = listLength((e :: es));
then
(cache,Values.INTEGER(len),st_1);

/* For expressions with value binding that can not determine type
e.g. size(x,2) when Real x[:,:]=fill(0.0,0,2); empty array with second dimension == 2, no way of
knowing that from the value. Must investigate the expression itself.*/
Expand Down
35 changes: 21 additions & 14 deletions Compiler/Interactive.mo
Expand Up @@ -5776,22 +5776,24 @@ algorithm
list<Env.Frame> env;
Absyn.Modification mod;
Absyn.Element elt;
Option<Absyn.Annotation> annOpt;

/* special case for clearing modifications */
/* case (Absyn.ELEMENT(final_ = f,redeclareKeywords = r,innerOuter = i,name = n,
specification = Absyn.EXTENDS(path = path,elementArg = eargs),info = info,constrainClass = constr),
specification = Absyn.EXTENDS(path = path,elementArg = eargs,annotationOpt = annOpt),info = info,constrainClass = constr),
inherit,submod,Absyn.CLASSMOD(elementArgLst = {},expOption = NONE),env)

then Absyn.ELEMENT(f,r,i,n,Absyn.EXTENDS(path,{}),info,constr); */
then Absyn.ELEMENT(f,r,i,n,Absyn.EXTENDS(path,{},annOpt),info,constr); */

case (Absyn.ELEMENT(final_ = f,redeclareKeywords = r,innerOuter = i,name = n,
specification = Absyn.EXTENDS(path = path,elementArg = eargs),info = info,constrainClass = constr),
specification = Absyn.EXTENDS(path = path,elementArg = eargs, annotationOpt = annOpt),info = info,constrainClass = constr),
inherit,submod,mod,env)
equation
(_,path_1) = Inst.makeFullyQualified(Env.emptyCache,env, path);
true = ModUtil.pathEqual(inherit, path_1);
eargs_1 = setSubmodifierInElementargs(eargs, submod, mod);
then
Absyn.ELEMENT(f,r,i,n,Absyn.EXTENDS(path,eargs_1),info,constr);
Absyn.ELEMENT(f,r,i,n,Absyn.EXTENDS(path,eargs_1,annOpt),info,constr);
case (elt,_,_,_,_) then elt;
end matchcontinue;
end setExtendsSubmodifierInElement;
Expand Down Expand Up @@ -5833,7 +5835,7 @@ algorithm
env = getClassEnv(p, p_class);
exts = getExtendsElementspecInClass(cdef);
exts_1 = Util.listMap1(exts, makeExtendsFullyQualified, env);
{Absyn.EXTENDS(extpath,extmod)} = Util.listSelect1(exts_1, name, extendsElementspecNamed);
{Absyn.EXTENDS(extpath,extmod,_)} = Util.listSelect1(exts_1, name, extendsElementspecNamed);
mod = getModificationValue(extmod, subident);
res = Dump.unparseModificationStr(mod);
then
Expand All @@ -5856,11 +5858,13 @@ algorithm
Absyn.Path path_1,path;
list<Absyn.ElementArg> earg;
list<Env.Frame> env;
case (Absyn.EXTENDS(path = path,elementArg = earg),env)
Option<Absyn.Annotation> annOpt;

case (Absyn.EXTENDS(path = path,elementArg = earg,annotationOpt = annOpt),env)
equation
(_,path_1) = Inst.makeFullyQualified(Env.emptyCache,env, path);
then
Absyn.EXTENDS(path_1,earg);
Absyn.EXTENDS(path_1,earg,annOpt);
end matchcontinue;
end makeExtendsFullyQualified;

Expand Down Expand Up @@ -5900,7 +5904,7 @@ algorithm
exts = getExtendsElementspecInClass(cdef);
env = getClassEnv(p, p_class);
exts_1 = Util.listMap1(exts, makeExtendsFullyQualified, env);
{Absyn.EXTENDS(extpath,extmod)} = Util.listSelect1(exts_1, name, extendsElementspecNamed);
{Absyn.EXTENDS(extpath,extmod,_)} = Util.listSelect1(exts_1, name, extendsElementspecNamed);
res = getModificationNames(extmod);
res_1 = Util.stringDelimitList(res, ", ");
res_2 = Util.stringAppendList({"{",res_1,"}"});
Expand Down Expand Up @@ -5964,7 +5968,7 @@ algorithm
ext;
case (Absyn.CLASS(body = Absyn.DERIVED(typeSpec=Absyn.TPATH(tp,_), arguments=eltArg)))
then
{Absyn.EXTENDS(tp,eltArg)}; // Note: the array dimensions of DERIVED are lost. They must be
{Absyn.EXTENDS(tp,eltArg,NONE())}; // Note: the array dimensions of DERIVED are lost. They must be
// queried by another api-function
case (_) then {};
end matchcontinue;
Expand Down Expand Up @@ -7321,6 +7325,8 @@ algorithm
Absyn.Import import_1,import_;
Boolean changed;
Option<Absyn.ArrayDim> x;
Option<Absyn.Annotation> annOpt;

case (Absyn.COMPONENTS(attributes = a,typeSpec = Absyn.TPATH(path_1,x),components = comp_items),old_comp,new_comp,env) /* the old name for the component signal if something in class have been changed rule Absyn.path_string(old_comp) => old_str & Absyn.path_string(new_comp) => new_str & Util.string_append_list({old_str,\" ==> \", new_str,\"\\n\"}) => print_str & print print_str & int_eq(1,2) => true --------- rename_class_in_element_spec(A,old_comp,new_comp,env) => (A,false) */
equation
(_,SCode.CLASS(id,_,_,_,_),cenv) = Lookup.lookupClass(Env.emptyCache,env, path_1, false);
Expand All @@ -7330,15 +7336,15 @@ algorithm
new_path = changeLastIdent(path, new_comp) "& Absyn.path_string(path) => old_str & Absyn.path_string(new_comp) => new_str & Absyn.path_string(new_path) => new2_str & Util.string_append_list({old_str,\" =E=> \", new_str,\" \",new2_str ,\"\\n\"}) => print_str & print print_str &" ;
then
(Absyn.COMPONENTS(a,Absyn.TPATH(new_path,x),comp_items),true);
case (Absyn.EXTENDS(path = path_1,elementArg = a),old_comp,new_comp,env)
case (Absyn.EXTENDS(path = path_1,elementArg = a, annotationOpt = annOpt),old_comp,new_comp,env)
local list<Absyn.ElementArg> a;
equation
(_,_,cenv) = Lookup.lookupClass(Env.emptyCache,env, path_1, false) "print \"rename_class_in_element_spec Absyn.EXTENDS(path,_) not implemented yet\"" ;
(_,path) = Inst.makeFullyQualified(Env.emptyCache,cenv, path_1);
true = ModUtil.pathEqual(path, old_comp);
new_path = changeLastIdent(path_1, new_comp);
then
(Absyn.EXTENDS(new_path,a),true);
(Absyn.EXTENDS(new_path,a,annOpt),true);
case (Absyn.IMPORT(import_ = import_,comment = a),old_comp,new_comp,env)
local Option<Absyn.Comment> a;
equation
Expand Down Expand Up @@ -9744,7 +9750,7 @@ algorithm
cdef = getPathedClassInProgram(modelpath, p);
extends_ = getExtendsInClass(cdef);
n_1 = n - 1;
Absyn.EXTENDS(path,_) = listNth(extends_, n_1);
Absyn.EXTENDS(path,_,_) = listNth(extends_, n_1);
s = Absyn.pathString(path);
then
s;
Expand Down Expand Up @@ -15867,16 +15873,17 @@ algorithm
list<Absyn.ElementArg> eargs,eargs1;
Absyn.ElementAttributes attr;
list<Absyn.ComponentItem> comps,comps1;
Option<Absyn.Annotation> annOpt;

case(Absyn.CLASSDEF(r,cl))
equation
((cl1,_,_)) = transformFlatClass((cl,NONE,0));
then Absyn.CLASSDEF(r,cl1);

case(Absyn.EXTENDS(path,eargs))
case(Absyn.EXTENDS(path,eargs,annOpt))
equation
eargs1 = Util.listMap(eargs,transformFlatElementArg);
then Absyn.EXTENDS(path,eargs1);
then Absyn.EXTENDS(path,eargs1,annOpt);

case(eltSpec as Absyn.IMPORT(import_ = _)) then eltSpec;

Expand Down
7 changes: 5 additions & 2 deletions Compiler/absyn_builder/walker.g
Expand Up @@ -853,15 +853,18 @@ extends_clause returns [void* ast]
{
void* path;
void* mod = 0;
void* ann = 0;
}
:
(#(e:EXTENDS
path = name_path
( mod = class_modification )?
( ann = annotation )?
)
{
if (!mod) mod = mk_nil();
ast = Absyn__EXTENDS(path,mod);
if (!ann) ann = mk_none();
ast = Absyn__EXTENDS(path,mod,mk_some(ann));
}
)
;
Expand All @@ -879,7 +882,7 @@ constraining_clause returns [void *ast]
)
{
if (!mod) mod = mk_nil();
ast = Absyn__EXTENDS(path,mod);
ast = Absyn__EXTENDS(path,mod,mk_none());
}
)
;
Expand Down
18 changes: 7 additions & 11 deletions modelica_parser/src/modelica_parser.g
Expand Up @@ -330,15 +330,10 @@ element_list :
element :
ic:import_clause
| ec:extends_clause
| (REDECLARE)?
(FINAL)?
(INNER)?
(OUTER)?
( (class_definition | cc:component_clause)
|(REPLACEABLE ( class_definition | cc2:component_clause )
(constraining_clause comment)?
)
)
| (REDECLARE)? (FINAL)? (INNER)? (OUTER)?
((class_definition | cc:component_clause)
|(REPLACEABLE ( class_definition | cc2:component_clause ) (constraining_clause comment)?)
)
{
if(#cc != null || #cc2 != null)
{
Expand Down Expand Up @@ -399,11 +394,12 @@ implicit_import_name!
// Note that this is a minor modification of the standard by
// allowing the comment.
extends_clause :
EXTENDS^ name_path ( class_modification )?
EXTENDS^ name_path (class_modification)? (annotation)?
;
constraining_clause :
extends_clause | CONSTRAINEDBY^ name_path ( class_modification )?
EXTENDS^ name_path (class_modification)?
| CONSTRAINEDBY^ name_path ( class_modification )?
;
/*
Expand Down

0 comments on commit d58761f

Please sign in to comment.