Skip to content

Commit

Permalink
* Changed ErrorExt to rollback from bottom instead of top(removed ear…
Browse files Browse the repository at this point in the history
…liest msg before)

* Implemented constraining class (for redeclaration)
* Pretty print functions for Modifers
* Redeclare checking, modifiers. 
* Check for multiple modifiers in same scope on same component
* Improved order of variables for UpdateComponentsinEnv/UpdateCompeltsMods

git-svn-id: https://openmodelica.org/svn/OpenModelica/branches/MathCoreOSMC@4140 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Björn Zachrisson committed Aug 3, 2009
1 parent 3572dac commit 206ddd4
Show file tree
Hide file tree
Showing 15 changed files with 1,091 additions and 317 deletions.
21 changes: 21 additions & 0 deletions Compiler/Absyn.mo
Expand Up @@ -1770,6 +1770,27 @@ algorithm
end matchcontinue;
end pathContainedIn;

public function getCrefsFromSubs "
Author BZ 2009-08
Function for getting ComponentRefs out from Subscripts
"
input list<Subscript> subs;
output list<ComponentRef> crefs;
algorithm crefs := matchcontinue(subs)
local
list<ComponentRef> crefs1;
Exp exp;
case({}) then {};
case(SUBSCRIPT(exp)::subs)
equation
crefs1 = getCrefsFromSubs(subs);
crefs = getCrefFromExp(exp);
crefs = listAppend(crefs,crefs1);
then
crefs;
end matchcontinue;
end getCrefsFromSubs;

public function getCrefFromExp "function: getCrefFromExp
Returns a flattened list of the
component references in an expression"
Expand Down
34 changes: 17 additions & 17 deletions Compiler/Builtin.mo
Expand Up @@ -74,67 +74,67 @@ protected constant SCode.Class enumType=SCode.CLASS("EnumType",false,false,SCode

protected constant SCode.Element unit=SCode.COMPONENT("unit",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("StringType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.STRING(""),false))),NONE,NONE,NONE,NONE) "This `unit\' component is used in several places below, and it is
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.STRING(""),false))),NONE,NONE,NONE,NONE,NONE) "This `unit\' component is used in several places below, and it is
declared once here to make the definitions below easier to read." ;

protected constant SCode.Element quantity=SCode.COMPONENT("quantity",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("StringType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.STRING(""),false))),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.STRING(""),false))),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element displayUnit=SCode.COMPONENT("displayUnit",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("StringType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.STRING(""),false))),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.STRING(""),false))),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element min=SCode.COMPONENT("min",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("RealType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.REAL(-1e+099),false))),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.REAL(-1e+099),false))),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element max=SCode.COMPONENT("max",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("RealType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.REAL(1e+099),false))),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.REAL(1e+099),false))),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element realStart=SCode.COMPONENT("start",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("RealType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.REAL(0.0),false))),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.REAL(0.0),false))),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element integerStart=SCode.COMPONENT("start",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("IntegerType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.INTEGER(0),false))),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.INTEGER(0),false))),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element stringStart=SCode.COMPONENT("start",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("StringType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.STRING(""),false))),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.STRING(""),false))),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element booleanStart=SCode.COMPONENT("start",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("BooleanType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.BOOL(false),false))),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.BOOL(false),false))),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element fixed=SCode.COMPONENT("fixed",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("BooleanType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.BOOL(false),false))),NONE,NONE,NONE,NONE) "Should be true for variables" ;
SCode.MOD(false,Absyn.NON_EACH(),{},SOME((Absyn.BOOL(false),false))),NONE,NONE,NONE,NONE,NONE) "Should be true for variables" ;

protected constant SCode.Element nominal=SCode.COMPONENT("nominal",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("RealType"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},NONE),NONE,NONE,NONE,NONE);
SCode.MOD(false,Absyn.NON_EACH(),{},NONE),NONE,NONE,NONE,NONE,NONE);

protected constant SCode.Element stateSelect=SCode.COMPONENT("stateSelect",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RW(),SCode.PARAM(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("StateSelect"),NONE),
SCode.MOD(false,Absyn.NON_EACH(),{},
SOME((
Absyn.CREF(
Absyn.CREF_QUAL("StateSelect",{},Absyn.CREF_IDENT("default",{}))),false))),NONE,NONE,NONE,NONE);
Absyn.CREF_QUAL("StateSelect",{},Absyn.CREF_IDENT("default",{}))),false))),NONE,NONE,NONE,NONE,NONE);

protected constant list<SCode.Element> stateSelectComps={
SCode.COMPONENT("never",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE),
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE,NONE),
SCode.COMPONENT("avoid",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE),
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE,NONE),
SCode.COMPONENT("default",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE),
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE,NONE),
SCode.COMPONENT("prefer",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE),
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE,NONE),
SCode.COMPONENT("always",Absyn.UNSPECIFIED(),true,false,false,
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE)} "The StateSelect enumeration" ;
SCode.ATTR({},false,false,SCode.RO(),SCode.CONST(),Absyn.BIDIR()),Absyn.TPATH(Absyn.IDENT("EnumType"),NONE),SCode.NOMOD(),NONE,NONE,NONE,NONE,NONE)} "The StateSelect enumeration" ;

protected constant SCode.Class stateSelectType=SCode.CLASS("StateSelect",false,false,SCode.R_ENUMERATION(),
SCode.PARTS(stateSelectComps,{},{},{},{},NONE)) "The State Select Type" ;
Expand Down
13 changes: 2 additions & 11 deletions Compiler/Ceval.mo
Expand Up @@ -3797,17 +3797,8 @@ algorithm
(cache,res) = cevalSubscriptValue(cache,env, subsc, v, sizelst, impl, msg);
then
(cache,res);
case (cache,env,cr,Types.UNBOUND(),(impl as false),MSG())
local
Exp.ComponentRef cr;
equation
/*Print.printBuf("- Ceval.cevalCrefBinding failed (UNBOUND)\n");*/
//Debug.fprint("ceval", "#- Ceval.cevalCrefBinding failed (UNBOUND)");
/* print("Ceval.cevalCrefBinding failed (UNBOUND) *********\n");
print(Exp.printComponentRefStr(cr));
print("\n");
*/ then
fail();
case (cache,env,_,Types.UNBOUND(),(impl as false),MSG())
then fail();
case (cache,env,_,Types.UNBOUND(),(impl as true),MSG())
equation
Debug.fprint("ceval", "#- Ceval.cevalCrefBinding: Ignoring unbound when implicit");
Expand Down
2 changes: 1 addition & 1 deletion Compiler/DFA.mo
Expand Up @@ -941,7 +941,7 @@ public function extractFieldName
algorithm
id := matchcontinue (elem)
local Absyn.Ident localId;
case (SCode.COMPONENT(localId,_,_,_,_,_,_,_,_,_,_,_)) then localId;
case (SCode.COMPONENT(localId,_,_,_,_,_,_,_,_,_,_,_,_)) then localId;
end matchcontinue;
end extractFieldName;

Expand Down
13 changes: 9 additions & 4 deletions Compiler/Error.mo
Expand Up @@ -213,6 +213,7 @@ public constant ErrorID REDUNDANT_GUESS=513 "Used by MathCore in Backend";
public constant ErrorID DERIVATIVE_NON_REAL=514;
public constant ErrorID UNUSED_MODIFIER=515;
public constant ErrorID SELECTED_STATES=515;
public constant ErrorID MULTIPLE_MODIFIER=516;


public constant ErrorID INDEX_REDUCTION_NOTIFICATION=1000;
Expand Down Expand Up @@ -380,7 +381,7 @@ protected constant list<tuple<Integer, MessageType, Severity, String>> errorTabl
(CONSTANT_OR_PARAM_WITH_NONCONST_BINDING,TRANSLATION(),
ERROR(),"%s is a constant or parameter with a non-constant initializer %s"),
(SUBSCRIPT_NOT_INT_OR_INT_ARRAY,TRANSLATION(),ERROR(),
"Subscript is not an integer or integer array in %s whis is of type %s"),
"Subscript is not an integer or integer array in %s which is of type %s"),
(TYPE_MISMATCH_IF_EXP,TRANSLATION(),ERROR(),
"Type mismatch in if-expression, true branch: %s has type %s, false branch: %s has type %s"),
(UNRESOLVABLE_TYPE,TRANSLATION(),ERROR(),
Expand All @@ -402,7 +403,7 @@ protected constant list<tuple<Integer, MessageType, Severity, String>> errorTabl
(BREAK_OUT_OF_LOOP, GRAMMAR(), WARNING(),
"A break statement not inside a loop"),
(DUPLICATE_ELEMENTS_NOT_IDENTICAL,TRANSLATION(),ERROR(),
"Error duplicate elements (due to inherited elements) not identical, first element is: %s, second element is: %s"),
"Duplicate elements (due to inherited elements) not identical, first element is: %s, second element is: %s"),
(PACKAGE_VARIABLE_NOT_CONSTANT, TRANSLATION(),ERROR(),"Variable %s in package %s is not constant"),
(RECURSIVE_DEFINITION,TRANSLATION(),ERROR(),"Class %s has a recursive definition, i.e. contains an instance of itself"),
(UNBOUND_PARAMETER_WARNING,TRANSLATION(),WARNING(),
Expand Down Expand Up @@ -465,14 +466,18 @@ protected constant list<tuple<Integer, MessageType, Severity, String>> errorTabl
"Modification on outer element: %s"),
(REDUNDANT_GUESS,TRANSLATION(),WARNING(),
"Start value is assigned for variable: %s, but not used since %s"),
(UNUSED_MODIFIER,TRANSLATION(),WARNING(),
"Modifer declared but never used: %s %s"),
(UNUSED_MODIFIER,TRANSLATION(),ERROR(),
"In modifier %s"),
(MISSING_INNER_PREFIX,TRANSLATION(),ERROR(),
"No corresponding 'inner' declaration found for component %s declared as '%s'."),
(DERIVATIVE_NON_REAL,TRANSLATION(),ERROR(),
"Illegal derivative. der(%s) where %s is of type %s, which is not a subtype of Real"),
(IMPLICIT_ITERATOR_NOT_FOUND_IN_LOOP_BODY,TRANSLATION(),ERROR(),
"Identificator %s of implicit for iterator must be present as array subscript in the loop body."),

(MULTIPLE_MODIFIER,TRANSLATION(),ERROR(),
"Multiple modifers in same scope for component %s, modifiers: %s"),

(STRUCT_SINGULAR_SYSTEM_INITIALIZATION,TRANSLATION(),ERROR(),
"The initialization problem of model is structurally singular, error found sorting equations %s for variables %s"),
(CIRCULAR_EQUATION, TRANSLATION(),ERROR(), " Equation : '%s' has circular references for variable %s."),
Expand Down

0 comments on commit 206ddd4

Please sign in to comment.