123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- 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',[]) ;
-
|