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