cmDependsFortranParser.y 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. %{
  2. /*=========================================================================
  3. Program: CMake - Cross-Platform Makefile Generator
  4. Module: $RCSfile$
  5. Language: C++
  6. Date: $Date$
  7. Version: $Revision$
  8. Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
  9. See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
  10. This software is distributed WITHOUT ANY WARRANTY; without even
  11. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  12. PURPOSE. See the above copyright notices for more information.
  13. =========================================================================*/
  14. /*-------------------------------------------------------------------------
  15. Portions of this source have been derived from makedepf90 version 2.8.8,
  16. Copyright (C) 2000--2006 Erik Edelmann <[email protected]>
  17. The code was originally distributed under the GPL but permission
  18. from the copyright holder has been obtained to distribute this
  19. derived work under the CMake license.
  20. -------------------------------------------------------------------------*/
  21. /*
  22. This file must be translated to C and modified to build everywhere.
  23. Run bison like this:
  24. bison --yacc --name-prefix=cmDependsFortran_yy
  25. --defines=cmDependsFortranParserTokens.h
  26. -ocmDependsFortranParser.cxx
  27. cmDependsFortranParser.y
  28. Modify cmDependsFortranParser.cxx:
  29. - remove TABs
  30. - Remove the yyerrorlab block in range ["goto yyerrlab1", "yyerrlab1:"]
  31. */
  32. /*-------------------------------------------------------------------------*/
  33. #define cmDependsFortranParser_cxx
  34. #include "cmDependsFortranParser.h" /* Interface to parser object. */
  35. #include "cmDependsFortranParserTokens.h" /* Need YYSTYPE for YY_DECL. */
  36. /* Configure the parser to use a lexer object. */
  37. #define YYPARSE_PARAM yyscanner
  38. #define YYLEX_PARAM yyscanner
  39. #define YYERROR_VERBOSE 1
  40. #define cmDependsFortran_yyerror(x) \
  41. cmDependsFortranError(yyscanner, x)
  42. /* Forward declare the lexer entry point. */
  43. YY_DECL;
  44. /* Helper function to forward error callback. */
  45. static void cmDependsFortranError(yyscan_t yyscanner, const char* message)
  46. {
  47. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  48. cmDependsFortranParser_Error(parser, message);
  49. }
  50. static char charmap[] = {
  51. '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
  52. '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
  53. '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
  54. '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
  55. '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
  56. '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
  57. '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
  58. '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
  59. '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
  60. '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
  61. '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
  62. '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
  63. '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
  64. '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
  65. '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
  66. '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
  67. '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
  68. '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
  69. '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
  70. '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
  71. '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
  72. '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
  73. '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
  74. '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
  75. '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
  76. '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
  77. '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
  78. '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
  79. '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
  80. '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
  81. '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
  82. '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377'
  83. };
  84. inline int strcasecmpCM(const char *s1, const char *s2)
  85. {
  86. const char *cm = charmap;
  87. const char* us1 = s1;
  88. const char* us2 = s2;
  89. while(cm[*us1] == cm[*us2++])
  90. if(*us1++ == '\0')
  91. {
  92. return(0);
  93. }
  94. return(cm[*us1] - cm[*--us2]);
  95. }
  96. static bool cmDependsFortranParserIsKeyword(const char* word,
  97. const char* keyword)
  98. {
  99. return strcasecmpCM(word, keyword) == 0;
  100. }
  101. /* Disable some warnings in the generated code. */
  102. #ifdef __BORLANDC__
  103. # pragma warn -8004 /* Variable assigned a value that is not used. */
  104. # pragma warn -8008 /* condition always returns true */
  105. # pragma warn -8060 /* possibly incorrect assignment */
  106. # pragma warn -8066 /* unreachable code */
  107. #endif
  108. #ifdef _MSC_VER
  109. # pragma warning (disable: 4102) /* Unused goto label. */
  110. # pragma warning (disable: 4065) /* Switch contains default but no case. */
  111. # pragma warning (disable: 4701) /* Local variable may not be initialized. */
  112. # pragma warning (disable: 4702) /* Unreachable code. */
  113. # pragma warning (disable: 4127) /* Conditional expression is constant. */
  114. # pragma warning (disable: 4244) /* Conversion to smaller type, data loss. */
  115. #endif
  116. %}
  117. /* Generate a reentrant parser object. */
  118. %pure-parser
  119. %union {
  120. char* string;
  121. }
  122. /*-------------------------------------------------------------------------*/
  123. /* Tokens */
  124. %token EOSTMT ASSIGNMENT_OP GARBAGE
  125. %token CPP_INCLUDE F90PPR_INCLUDE COCO_INCLUDE
  126. %token F90PPR_DEFINE CPP_DEFINE F90PPR_UNDEF CPP_UNDEF
  127. %token CPP_IFDEF CPP_IFNDEF CPP_IF CPP_ELSE CPP_ELIF CPP_ENDIF
  128. %token F90PPR_IFDEF F90PPR_IFNDEF F90PPR_IF
  129. %token F90PPR_ELSE F90PPR_ELIF F90PPR_ENDIF
  130. %token COMMA DCOLON
  131. %token <string> CPP_TOENDL
  132. %token <number> UNTERMINATED_STRING
  133. %token <string> STRING WORD
  134. /*-------------------------------------------------------------------------*/
  135. /* grammar */
  136. %%
  137. code: /* empty */ | code stmt;
  138. stmt: keyword_stmt | assignment_stmt;
  139. assignment_stmt: WORD ASSIGNMENT_OP other EOSTMT /* Ignore */
  140. {
  141. free($1);
  142. }
  143. keyword_stmt:
  144. WORD EOSTMT
  145. {
  146. if (cmDependsFortranParserIsKeyword($1, "interface"))
  147. {
  148. cmDependsFortranParser* parser =
  149. cmDependsFortran_yyget_extra(yyscanner);
  150. cmDependsFortranParser_SetInInterface(parser, true);
  151. }
  152. free($1);
  153. }
  154. | WORD WORD other EOSTMT
  155. {
  156. if (cmDependsFortranParserIsKeyword($1, "use"))
  157. {
  158. cmDependsFortranParser* parser =
  159. cmDependsFortran_yyget_extra(yyscanner);
  160. cmDependsFortranParser_RuleUse(parser, $2);
  161. }
  162. else if (cmDependsFortranParserIsKeyword($1, "module"))
  163. {
  164. cmDependsFortranParser* parser =
  165. cmDependsFortran_yyget_extra(yyscanner);
  166. cmDependsFortranParser_RuleModule(parser, $2);
  167. }
  168. else if (cmDependsFortranParserIsKeyword($1, "interface"))
  169. {
  170. cmDependsFortranParser* parser =
  171. cmDependsFortran_yyget_extra(yyscanner);
  172. cmDependsFortranParser_SetInInterface(parser, true);
  173. }
  174. else if (cmDependsFortranParserIsKeyword($2, "interface") &&
  175. cmDependsFortranParserIsKeyword($1, "end"))
  176. {
  177. cmDependsFortranParser* parser =
  178. cmDependsFortran_yyget_extra(yyscanner);
  179. cmDependsFortranParser_SetInInterface(parser, false);
  180. }
  181. free($1);
  182. free($2);
  183. }
  184. | WORD DCOLON WORD other EOSTMT
  185. {
  186. if (cmDependsFortranParserIsKeyword($1, "use"))
  187. {
  188. cmDependsFortranParser* parser =
  189. cmDependsFortran_yyget_extra(yyscanner);
  190. cmDependsFortranParser_RuleUse(parser, $3);
  191. }
  192. free($1);
  193. free($3);
  194. }
  195. | WORD COMMA WORD DCOLON WORD other EOSTMT
  196. {
  197. if (cmDependsFortranParserIsKeyword($1, "use") &&
  198. cmDependsFortranParserIsKeyword($3, "non_intrinsic") )
  199. {
  200. cmDependsFortranParser* parser =
  201. cmDependsFortran_yyget_extra(yyscanner);
  202. cmDependsFortranParser_RuleUse(parser, $5);
  203. }
  204. free($1);
  205. free($3);
  206. free($5);
  207. }
  208. | WORD STRING other EOSTMT /* Ignore */
  209. {
  210. if (cmDependsFortranParserIsKeyword($1, "include"))
  211. {
  212. cmDependsFortranParser* parser =
  213. cmDependsFortran_yyget_extra(yyscanner);
  214. cmDependsFortranParser_RuleInclude(parser, $2);
  215. }
  216. free($1);
  217. free($2);
  218. }
  219. | include STRING other EOSTMT
  220. {
  221. cmDependsFortranParser* parser =
  222. cmDependsFortran_yyget_extra(yyscanner);
  223. cmDependsFortranParser_RuleInclude(parser, $2);
  224. free($2);
  225. }
  226. | define WORD other EOSTMT
  227. {
  228. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  229. cmDependsFortranParser_RuleDefine(parser, $2);
  230. free($2);
  231. }
  232. | undef WORD other EOSTMT
  233. {
  234. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  235. cmDependsFortranParser_RuleUndef(parser, $2);
  236. free($2);
  237. }
  238. | ifdef WORD other EOSTMT
  239. {
  240. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  241. cmDependsFortranParser_RuleIfdef(parser, $2);
  242. free($2);
  243. }
  244. | ifndef WORD other EOSTMT
  245. {
  246. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  247. cmDependsFortranParser_RuleIfndef(parser, $2);
  248. free($2);
  249. }
  250. | if other EOSTMT
  251. {
  252. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  253. cmDependsFortranParser_RuleIf(parser);
  254. }
  255. | elif other EOSTMT
  256. {
  257. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  258. cmDependsFortranParser_RuleElif(parser);
  259. }
  260. | else other EOSTMT
  261. {
  262. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  263. cmDependsFortranParser_RuleElse(parser);
  264. }
  265. | endif other EOSTMT
  266. {
  267. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  268. cmDependsFortranParser_RuleEndif(parser);
  269. }
  270. | WORD GARBAGE other EOSTMT /* Ignore */
  271. {
  272. free($1);
  273. }
  274. | GARBAGE other EOSTMT
  275. | EOSTMT
  276. | error
  277. ;
  278. include: CPP_INCLUDE | F90PPR_INCLUDE | COCO_INCLUDE ;
  279. define: CPP_DEFINE | F90PPR_DEFINE;
  280. undef: CPP_UNDEF | F90PPR_UNDEF ;
  281. ifdef: CPP_IFDEF | F90PPR_IFDEF ;
  282. ifndef: CPP_IFNDEF | F90PPR_IFNDEF ;
  283. if: CPP_IF | F90PPR_IF ;
  284. elif: CPP_ELIF | F90PPR_ELIF ;
  285. else: CPP_ELSE | F90PPR_ELSE ;
  286. endif: CPP_ENDIF | F90PPR_ENDIF ;
  287. other: /* empty */ | other misc_code ;
  288. misc_code:
  289. WORD { free ($1); }
  290. | STRING { free ($1); }
  291. | GARBAGE
  292. | ASSIGNMENT_OP
  293. | DCOLON
  294. | COMMA
  295. | UNTERMINATED_STRING
  296. ;
  297. %%
  298. /* End of grammar */