function model = mttFetchDomain(filename)
model.representation = 'domain' ;
mttAssert(mttFileExists(filename),...
['File "',filename,'" not found']) ;
mttNotify([' ...processing ',filename]) ;
mttWriteNewLine ;
model.source = mttCutText(filename,'_domain.txt') ;
content = mttReadFile(filename) ;
statements = mttExtractStatements(content) ;
number_of_statements = length(statements) ;
next = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case {'domain','public_domain','private_domain'},
domain_name = line ;
mttValidateName(domain_name) ;
[domain,next] = fetch_domain(statements,next,domain_name) ;
model = setfield(model,'item',domain_name,domain) ;
is_private = strcmp(keyword,'private_domain') ;
model = setfield(model,'item',domain_name,'is_private',is_private) ;
case {'multi_domain','public_multi_domain','private_multi_domain'},
domain_name = line ;
mttValidateName(domain_name) ;
[domain,next] = fetch_multi_domain(statements,next,domain_name) ;
model = setfield(model,'item',domain_name,domain) ;
is_private = strcmp(keyword,'private_multi_domain') ;
model = setfield(model,'item',domain_name,'is_private',is_private) ;
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 [domain,next] = fetch_domain(statements,next,domain_name)
domain = [] ;
unit_name = 'domain' ;
number_of_statements = length(statements) ;
effort_declared = 0 ;
flow_declared = 0 ;
open = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case 'effort',
mttAssert(open,...
['"effort" declarations must be contained inside {...} in "',unit_name,'"']) ;
mttAssert(~effort_declared,...
['"effort" declarations must be unique in "',unit_name,'"']) ;
mttAssert(~isempty(line),...
['Undefined "effort" in "',unit_name,'"']) ;
[covar,default] = mttCutText(line,'=') ;
mttValidateName(covar) ;
domain.covar.effort = covar ;
domain.covar.effort_default = default ;
effort_declared = 1 ;
case 'flow',
mttAssert(open,...
['"flow" declarations must be contained inside {...} in "',unit_name,'"']) ;
mttAssert(~flow_declared,...
['"flow" declarations must be unique in "',unit_name,'"']) ;
mttAssert(~isempty(line),...
['Undefined "flow" in "',unit_name,'"']) ;
[covar,default] = mttCutText(line,'=') ;
mttValidateName(covar) ;
domain.covar.flow = covar ;
domain.covar.flow_default = default ;
flow_declared = 1 ;
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
function [domain,next] = fetch_multi_domain(statements,next,domain_name)
domain = [] ;
unit_name = 'domain' ;
number_of_statements = length(statements) ;
counter = 0 ;
open = 0 ;
parsing = 1 ;
while parsing
next = next + 1 ;
statement = statements{next} ;
[keyword,line] = mttSeparateText(statement) ;
switch keyword
case 'bond',
mttAssert(open,...
['"bond" declarations must be contained inside {...} in "',unit_name,'"']) ;
mttAssert(~isempty(line),...
['Undefined "bond" in "',unit_name,'"']) ;
[bond_name,bond_domain] = mttCutText(line,'[') ;
[bond_domain,rubbish] = mttCutText(bond_domain,']') ;
mttAssert(isempty(rubbish),...
['Unexpected text after "]" in "',unit_name,'"']) ;
if ~isempty(bond_name)
mttValidateName(bond_name) ;
end
counter = counter + 1 ;
domain.bond(counter).name = bond_name ;
domain.bond(counter).domain = bond_domain ;
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