mttFetchEnvironment.m 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. function model = mttFetchEnvironment(filename)
  2. model.representation = 'env' ;
  3. mttAssert(mttFileExists(filename),...
  4. ['File "',filename,'" not found']) ;
  5. mttNotify([' ...processing ',filename]) ;
  6. mttWriteNewLine ;
  7. model.source = mttCutText(filename,'_env.txt') ;
  8. model_name = mttDetachText(model.source,'/') ;
  9. content = mttReadFile(filename) ;
  10. statements = mttExtractStatements(content) ;
  11. number_of_statements = length(statements) ;
  12. env_declared = 0 ;
  13. next = 0 ;
  14. parsing = 1 ;
  15. while parsing
  16. next = next + 1 ;
  17. statement = statements{next} ;
  18. [keyword,line] = mttSeparateText(statement) ;
  19. switch keyword
  20. case 'env',
  21. mttAssert(~env_declared,...
  22. '"env" declaration must be unique') ;
  23. env_declared = 1 ;
  24. env_name = line ;
  25. mttAssert(strcmp(env_name,model_name),...
  26. ['Wrong name:[',env_name,'] Expecting:[',model_name,']']) ;
  27. [env,next] = fetch_env(statements,next) ;
  28. model = mttAppendFields(model,env) ;
  29. case '{',
  30. error('Unexpected "{" found') ;
  31. case '}',
  32. error('Unexpected "}" found') ;
  33. otherwise,
  34. error(['Unrecognised top-level keyword "',keyword,'"']) ;
  35. end
  36. if next==number_of_statements
  37. parsing = 0 ;
  38. end
  39. end
  40. function [env,next] = fetch_env(statements,next)
  41. env = [] ;
  42. unit_name = 'env' ;
  43. number_of_statements = length(statements) ;
  44. open = 0 ;
  45. parsing = 1 ;
  46. while parsing
  47. next = next + 1 ;
  48. statement = statements{next} ;
  49. [keyword,line] = mttSeparateText(statement) ;
  50. switch keyword
  51. case 'path',
  52. mttAssert(open,...
  53. ['"path" declarations must be contained inside {...} in "',unit_name,'"']) ;
  54. path_names = mttGetFieldNames(env,'path') ;
  55. [path_name,path_spec] = mttCutText(line,':=') ;
  56. mttAssert(~ismember(path_name,path_names),...
  57. ['Path "',path_name,'" already declared']) ;
  58. mttAssert(path_name(1)=='$',...
  59. ['Path "',path_name,'" must be prefixed with "$"']) ;
  60. path_name(1) = [] ;
  61. env = setfield(env,'path',path_name,path_spec) ;
  62. case 'domain',
  63. mttAssert(open,...
  64. ['"domain" declarations must be contained inside {...} in "',unit_name,'"']) ;
  65. domain_names = mttGetFieldNames(env,'domain') ;
  66. [domain_name,domain_spec] = mttCutText(line,':=') ;
  67. mttAssert(~ismember(domain_name,domain_names),...
  68. ['Domain "',domain_name,'" already declared']) ;
  69. env = setfield(env,'domain',domain_name,domain_spec) ;
  70. case 'struct',
  71. mttAssert(open,...
  72. ['"struct" declarations must be contained inside {...} in "',unit_name,'"']) ;
  73. struct_names = mttGetFieldNames(env,'struct') ;
  74. [struct_name,struct_spec] = mttCutText(line,':=') ;
  75. mttAssert(~ismember(struct_name,struct_names),...
  76. ['Struct "',struct_name,'" already declared']) ;
  77. mttAssert(~isempty(struct_spec),...
  78. ['Undefined datatype within struct "',struct_name,'"']) ;
  79. env = setfield(env,'struct',struct_name,struct_spec) ;
  80. case '{',
  81. mttAssert(~open,['Unmatched "{" in "',unit_name,'"']) ;
  82. open = 1 ;
  83. case '}',
  84. mttAssert(open,['Unmatched "}" in "',unit_name,'"']) ;
  85. open = 0 ;
  86. otherwise,
  87. error(['Unrecognised_keyword "',keyword,'" in "',unit_name,'"']) ;
  88. end
  89. mttAssert(~(open & (next==number_of_statements)),...
  90. ['Missing "}" in "',unit_name,'"']) ;
  91. if (~open) | (next==number_of_statements)
  92. parsing = 0 ;
  93. end
  94. end
  95. env = mttSetFieldDefault(env,'path',[]) ;
  96. env = mttSetFieldDefault(env,'domain',[]) ;
  97. env = mttSetFieldDefault(env,'struct',[]) ;