function model = mttFetchSpecification(filename)
model = [] ;
mttAssert(mttFileExists(filename),...
['File "',filename,'" not found']) ;
mttNotify([' ...processing ',filename]) ;
mttWriteNewLine ;
model.specification = filename ;
model.source = mttCutText(filename,'_abg.txt') ;
model_name = mttDetachText(model.source,'/') ;
content = mttReadFile(filename) ;
statements = mttExtractStatements(content) ;
number_of_statements = length(statements) ;
abg_declared = 0 ;
next = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case 'abg',
mttAssert(~abg_declared,...
'"abg" declaration must be unique') ;
abg_declared = 1 ;
abg_name = mttCutText(line,'[') ;
mttAssert(strcmp(abg_name,model_name),...
['Wrong name:[',abg_name,'] Expecting:[',model_name,']']) ;
abg_parameter_list = mttExtractText(line,'[',']') ;
[abg_parameters,abg_defaults] = mttGetParameters(abg_parameter_list) ;
model.name = abg_name ;
model.sympar = abg_parameters ;
model.sympar_default = abg_defaults ;
[abg,next] = fetch_abg(statements,next) ;
model = mttAppendFields(model,abg) ;
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
mttCheckBondgraphDeclarations(model) ;
function [abg,next] = fetch_abg(statements,next)
global mtt_environment
abg = [] ;
unit_name = 'abg' ;
user_defined_paths = mttGetFieldNames(mtt_environment,'path') ;
number_of_statements = length(statements) ;
bondgraph = [] ;
use_declared = 0 ;
open = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case 'use',
mttAssert(open,...
['"use" declaration must be contained inside {...} in "',unit_name,'"']) ;
mttAssert(~use_declared,...
'"use" declaration must be unique') ;
use_declared = 1 ;
bondgraph = line ;
abg.bondgraph = bondgraph ;
case 'input',
mttAssert(open,...
['"input" declarations must be contained inside {...} in "',unit_name,'"']) ;
input_parameter_list = line ;
[input_parameters,input_defaults] = mttGetParameters(input_parameter_list) ;
abg = mttAppend(abg,'input',input_parameters) ;
abg = mttAppend(abg,'input_default',input_defaults) ;
case 'numpar',
mttAssert(open,...
['"numpar" declarations must be contained inside {...} in "',unit_name,'"']) ;
numerical_parameter_list = line ;
[numerical_parameters,numerical_defaults] = mttGetParameters(numerical_parameter_list) ;
abg = mttAppend(abg,'numpar',numerical_parameters) ;
abg = mttAppend(abg,'numpar_default',numerical_defaults) ;
case 'object',
mttAssert(open,...
['"object" declarations must be contained inside {...} in "',unit_name,'"']) ;
object_names = mttGetFieldNames(abg,'obj') ;
[object_name,object_spec] = mttCutText(line,':=') ;
mttAssert(~ismember(object_name,object_names),...
['Object "',object_name,'" already declared']) ;
implementation = mttCutText(object_spec,'[') ;
mttAssert(~isempty(implementation),...
['Incomplete specification:[',line,']']) ;
object_parameter_list = mttExtractText(line,'[',']') ;
object_parameters = mttGetInstanceParameters(object_parameter_list) ;
[source,name.item] = mttCutText(implementation,'::') ;
[name.class,name.path] = mttDetachText(source,'/') ;
if isempty(name.class)
name.class = source ;
name.path = [] ;
else
mttAssert(~isempty(name.path),...
['Empty path name in "',unit_name,'"']) ;
if name.path(1)=='$'
[path_alias,path_branch] = mttCutText(name.path,'/') ;
path_alias(1) = [] ;
mttAssert(ismember(path_alias,user_defined_paths),...
['Path "',path_alias,'" not recognised']) ;
path_root = getfield(mtt_environment,'path',path_alias) ;
if isempty(path_branch)
name.path = path_root ;
else
name.path = [path_root,'/',path_branch] ;
end
end
end
abg = setfield(abg,'obj',object_name,'name',name) ;
abg = setfield(abg,'obj',object_name,'parameter',object_parameters) ;
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
abg = mttSetFieldDefault(abg,'input',[]) ;
abg = mttSetFieldDefault(abg,'input_default',[]) ;
abg = mttSetFieldDefault(abg,'numpar',[]) ;
abg = mttSetFieldDefault(abg,'numpar_default',[]) ;
abg = mttSetFieldDefault(abg,'bondgraph',[]) ;