Skip to content

Commit

Permalink
lookup according to Modelica 2.0 (impl in vardnas workshop)
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@897 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Peter Aronsson committed Jan 19, 2003
1 parent 3a3a62e commit f1ab9da
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 12 deletions.
6 changes: 3 additions & 3 deletions modeq/absyn_builder/walker.g
Expand Up @@ -121,8 +121,8 @@ stored_definition returns [void *ast]
;

interactive_stmt returns [void *ast]
{
void *a1=0;
{
void *a1=0;
void *e1=0;
}
:
Expand All @@ -131,7 +131,7 @@ interactive_stmt returns [void *ast]
{
if (a1 != 0 )
ast = Interactive__ISTMTS(mk_cons(Interactive__IALG(a1),mk_nil()));
else
else
ast = Interactive__ISTMTS(mk_cons(Interactive__IEXP(e1),mk_nil()));
assert(ast != 0);
}
Expand Down
69 changes: 66 additions & 3 deletions modeq/interactive.rml
Expand Up @@ -93,6 +93,11 @@ relation evaluate: (InteractiveStmts, InteractiveSymbolTable) => (string,Intera
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("clear",_),_))]),_)
=> ("Clearing symbol table\n", newst)

rule let newst = SYMBOLTABLE(p,fp,ic,[],cf)
-------------------------------------------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("clearVariables",_),_))]),SYMBOLTABLE(p,fp,ic,iv,cf))
=> ("Clearing variables.\n", newst)

rule Dump.unparse_str(p) => str
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("list",_),Absyn.FUNCTIONARGS([],[])))]),st as SYMBOLTABLE(p,_,_,_,_))
Expand Down Expand Up @@ -171,12 +176,50 @@ relation evaluate: (InteractiveStmts, InteractiveSymbolTable) => (string,Intera
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("typeOf",_),Absyn.FUNCTIONARGS([ Absyn.CREF(Absyn.CREF_IDENT(varid,_))],[])))]),st as SYMBOLTABLE(p,_,_,vars,_))
=> (str',st)

rule System.pwd() => res &
string_append(res,"\n") => res'
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("cd",_),Absyn.FUNCTIONARGS([],[])))]),st as SYMBOLTABLE(p,_,_,vars,_))
=> (res',st)

rule System.cd(str) => res &
int_eq (res,0) => true &
System.pwd => str' &
string_append(str',"\n") => str''
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("cd",_),Absyn.FUNCTIONARGS([ Absyn.STRING(str)],[])))]),st as SYMBOLTABLE(p,_,_,vars,_))
=> (str'',st)

rule System.cd(str) => res &
int_eq (res,0) => false
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("cd",_),Absyn.FUNCTIONARGS([ Absyn.STRING(str)],[])))]),st as SYMBOLTABLE(p,_,_,vars,_))
=> ("No such directory\n",st)

rule System.system_call(str) => res &
int_string res => str' &
string_append(str',"\n") => str''
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("system",_),Absyn.FUNCTIONARGS([ Absyn.STRING(str)],[])))]),st as SYMBOLTABLE(p,_,_,vars,_))
=> (str'',st)

rule System.read_file(str) => str' &
string_append(str',"\n") => str''
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("cat",_),Absyn.FUNCTIONARGS([ Absyn.STRING(str)],[])))]),st as SYMBOLTABLE(p,_,_,vars,_))
=> (str'',st)

rule get_variable_names(vars) => vars &
string_append(vars,"\n") => str
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("listVariables",_),Absyn.FUNCTIONARGS([],[])))]),st as SYMBOLTABLE(_,_,_,vars,_))
=> (str,st)

rule not get_type_of_variable(varid,vars) => tp &
string_append(varid, " is not defined\n") => str
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("typeOf",_),Absyn.FUNCTIONARGS([ Absyn.CREF(Absyn.CREF_IDENT(varid,_))],[])))]),st as SYMBOLTABLE(p,_,_,vars,_))
=> (str,st)


rule evaluate_graphical_api(stmts,st) => (str,newst)
----------------------------------------------------
Expand Down Expand Up @@ -206,10 +249,12 @@ relation evaluate_expr: (InteractiveStmt, InteractiveSymbolTable) =>
-------------------------------
evaluate_expr(IEXP(exp),st as SYMBOLTABLE(p,_,_,_,_)) => (str,st')

rule print "alg_assign\n" &
build_env_from_symboltable(st) => env &
rule build_env_from_symboltable(st) => env &
print "built env\n" &
Static.elab_exp(env,exp,true,SOME(st)) => (sexp,Types.PROP(t,_),SOME(st')) &
print "elabed env\n" &
Static.ceval(env,sexp,true,SOME(st')) => value &
print "evaled env\n" &
add_var_to_symboltable(ident,value,t,st') => newst
-----------------------------------------------
evaluate_expr(IALG(Absyn.ALGORITHMITEM(Absyn.ALG_ASSIGN(Absyn.CREF_IDENT(ident,[]),exp),_)),st as SYMBOLTABLE(p,_,_,_,_))
Expand All @@ -220,6 +265,24 @@ relation evaluate_expr: (InteractiveStmt, InteractiveSymbolTable) =>
evaluate_expr(stmt,st) => (str,st)
end

relation get_variable_names: (InteractiveVariable list) => string =

rule get_variable_list_str(vars) => strlst &
Util.string_delimit_list(strlst,", ") => str &
Util.string_append_list(["{",str,"}"]) => res
---------------------------------------------
get_variable_names(vars) => res
end

relation get_variable_list_str: (InteractiveVariable list) => string list =

axiom get_variable_list_str([]) => []

rule get_variable_list_str(vs)=> res
----------------------------
get_variable_list_str(IVAR(p,_,_)::vs) => p::res
end

relation get_type_of_variable: (Absyn.Ident, InteractiveVariable list) => Types.Type =
axiom get_type_of_variable(id,[]) => fail

Expand Down
64 changes: 61 additions & 3 deletions modeq/runtime/systemimpl.c
@@ -1,6 +1,9 @@
#include "rml.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/unistd.h>
#include <sys/stat.h>
#include "read_write.h"
#include "../values.h"

Expand Down Expand Up @@ -80,6 +83,41 @@ RML_BEGIN_LABEL(System__execute_5ffunction)
}
RML_END_LABEL

RML_BEGIN_LABEL(System__system_5fcall)
{
char* str = RML_STRINGDATA(rmlA0);
int ret_val;
ret_val = system(str);

rmlA0 = (void*) mk_icon(ret_val);

RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(System__cd)
{
char* str = RML_STRINGDATA(rmlA0);
int ret_val;
ret_val = chdir(str);

rmlA0 = (void*) mk_icon(ret_val);

RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(System__pwd)
{
char buf[MAXPATHLEN];
getcwd(buf,MAXPATHLEN);
rmlA0 = (void*) mk_scon(buf);

RML_TAILCALLK(rmlSC);
}
RML_END_LABEL


RML_BEGIN_LABEL(System__write_5ffile)
{
char* data = RML_STRINGDATA(rmlA1);
Expand All @@ -95,9 +133,29 @@ RML_END_LABEL

RML_BEGIN_LABEL(System__read_5ffile)
{
char* str = RML_STRINGDATA(rmlA0);
printf("read_file, data:%s\n",str);
RML_TAILCALLK(rmlSC);
char* filename = RML_STRINGDATA(rmlA0);
char* buf;
int res;
FILE * file = NULL;
struct stat statstr;
res = stat(filename, &statstr);

if(res!=0){
rmlA0 = (void*) mk_scon("No such file");
RML_TAILCALLK(rmlSC);
}

file = fopen(filename,"rb");
buf = malloc(statstr.st_size+1);

if( (res = fread(buf, sizeof(char), statstr.st_size, file)) != statstr.st_size){
rmlA0 = (void*) mk_scon("Failed while reading file");
RML_TAILCALLK(rmlSC);
}

fclose(file);
rmlA0 = (void*) mk_scon(buf);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

Expand Down
6 changes: 6 additions & 0 deletions modeq/system.rml
Expand Up @@ -39,4 +39,10 @@ relation read_file: (string) => string

relation read_values_from_file: (string) => Values.Value

relation system_call: (string) => int

relation cd: (string) => int

relation pwd: () => string

end
7 changes: 4 additions & 3 deletions modeq/types.rml
Expand Up @@ -351,9 +351,10 @@ relation lookup_component : (Type, Ident) => Var =
------------------------------
lookup_component(T_COMPLEX(st,cs), id) => v

rule Print.print_buf "# Can't lookup components in arrays\n"
------------------------------
lookup_component(T_ARRAY(dim,t), id) => fail
rule lookup_component2(cs,id) => VAR(n,attr,prot,ty,bnd) &
let ty' = T_ARRAY(dim,ty)
-----------------------------
lookup_component(T_ARRAY(dim,T_COMPLEX(st,cs)), id) => VAR(n,attr,prot,ty',bnd)

rule Print.print_buf "- Looking up " &
Print.print_buf id &
Expand Down

0 comments on commit f1ab9da

Please sign in to comment.