function model = mttFetchEnvironment(filename)
model.representation = 'env' ;
mttAssert(mttFileExists(filename),...
['File "',filename,'" not found']) ;
mttNotify([' ...processing ',filename]) ;
mttWriteNewLine ;
model.source = mttCutText(filename,'_env.txt') ;
model_name = mttDetachText(model.source,'/') ;
content = mttReadFile(filename) ;
statements = mttExtractStatements(content) ;
number_of_statements = length(statements) ;
env_declared = 0 ;
next = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case 'env',
mttAssert(~env_declared,...
'"env" declaration must be unique') ;
env_declared = 1 ;
env_name = line ;
mttAssert(strcmp(env_name,model_name),...
['Wrong name:[',env_name,'] Expecting:[',model_name,']']) ;
[env,next] = fetch_env(statements,next) ;
model = mttAppendFields(model,env) ;
case '{',
error('Unexpected "{" found') ;
case '}',
error('Unexpected "}" found') ;
otherwise,
error(['Unrecognised top-level keyword "',keyword,'"']) ;
end
if next==number_of_statements
parsing = 0 ;
end
end
function [env,next] = fetch_env(statements,next)
env = [] ;
unit_name = 'env' ;
number_of_statements = length(statements) ;
open = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case 'path',
mttAssert(open,...
['"path" declarations must be contained inside {...} in "',unit_name,'"']) ;
path_names = mttGetFieldNames(env,'path') ;
[path_name,path_spec] = mttCutText(line,':=') ;
mttAssert(~ismember(path_name,path_names),...
['Path "',path_name,'" already declared']) ;
mttAssert(path_name(1)=='$',...
['Path "',path_name,'" must be prefixed with "$"']) ;
path_name(1) = [] ;
env = setfield(env,'path',path_name,path_spec) ;
case 'domain',
mttAssert(open,...
['"domain" declarations must be contained inside {...} in "',unit_name,'"']) ;
domain_names = mttGetFieldNames(env,'domain') ;
[domain_name,domain_spec] = mttCutText(line,':=') ;
mttAssert(~ismember(domain_name,domain_names),...
['Domain "',domain_name,'" already declared']) ;
env = setfield(env,'domain',domain_name,domain_spec) ;
case 'struct',
mttAssert(open,...
['"struct" declarations must be contained inside {...} in "',unit_name,'"']) ;
struct_names = mttGetFieldNames(env,'struct') ;
[struct_name,struct_spec] = mttCutText(line,':=') ;
mttAssert(~ismember(struct_name,struct_names),...
['Struct "',struct_name,'" already declared']) ;
mttAssert(~isempty(struct_spec),...
['Undefined datatype within struct "',struct_name,'"']) ;
env = setfield(env,'struct',struct_name,struct_spec) ;
case '{',
mttAssert(~open,['Unmatched "{" in "',unit_name,'"']) ;
open = 1 ;
case '}',
mttAssert(open,['Unmatched "}" in "',unit_name,'"']) ;
open = 0 ;
otherwise,
error(['Unrecognised_keyword "',keyword,'" in "',unit_name,'"']) ;
end
mttAssert(~(open & (next==number_of_statements)),...
['Missing "}" in "',unit_name,'"']) ;
if (~open) | (next==number_of_statements)
parsing = 0 ;
end
end
env = mttSetFieldDefault(env,'path',[]) ;
env = mttSetFieldDefault(env,'domain',[]) ;
env = mttSetFieldDefault(env,'struct',[]) ;