cmDependsFortranParser.y 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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 makefdep90 version 2.6.2,
  16. Copyright (C) 2000,2001 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 --defines=cmDependsFortranParserTokens.h -ocmDependsFortranParser.cxx cmDependsFortranParser.y
  25. Modify cmDependsFortranParser.cxx:
  26. - remove TABs
  27. - add __HP_aCC to the #if test for yyerrorlab warning suppression
  28. - add __INTEL_COMPILER to the #if test for yyerrorlab warning suppression
  29. */
  30. /*-------------------------------------------------------------------------*/
  31. #define cmDependsFortranParser_cxx
  32. #include "cmDependsFortranParser.h" /* Interface to parser object. */
  33. #include "cmDependsFortranParserTokens.h" /* Need YYSTYPE for YY_DECL. */
  34. /* Configure the parser to use a lexer object. */
  35. #define YYPARSE_PARAM yyscanner
  36. #define YYLEX_PARAM yyscanner
  37. #define YYERROR_VERBOSE 1
  38. #define cmDependsFortran_yyerror(x) \
  39. cmDependsFortranError(yyscanner, x)
  40. /* Forward declare the lexer entry point. */
  41. YY_DECL;
  42. /* Helper function to forward error callback. */
  43. static void cmDependsFortranError(yyscan_t yyscanner, const char* message)
  44. {
  45. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  46. cmDependsFortranParser_Error(parser, message);
  47. }
  48. /* Disable some warnings in the generated code. */
  49. #ifdef __BORLANDC__
  50. # pragma warn -8004 /* Variable assigned a value that is not used. */
  51. #endif
  52. #ifdef _MSC_VER
  53. # pragma warning (disable: 4102) /* Unused goto label. */
  54. # pragma warning (disable: 4065) /* Switch contains default but no case. */
  55. #endif
  56. %}
  57. /* Generate a reentrant parser object. */
  58. %pure_parser
  59. %union {
  60. char* string;
  61. }
  62. /*-------------------------------------------------------------------------*/
  63. /* Tokens */
  64. %token USE F_INCLUDE MODULE EOSTMT
  65. %token CPP_INCLUDE F90PPR_INCLUDE COCO_INCLUDE
  66. %token F90PPR_DEFINE CPP_DEFINE F90PPR_UNDEF CPP_UNDEF
  67. %token CPP_IFDEF CPP_IFNDEF CPP_IF CPP_ELSE CPP_ELIF CPP_ENDIF
  68. %token F90PPR_IFDEF F90PPR_IFNDEF F90PPR_IF F90PPR_ELSE F90PPR_ELIF F90PPR_ENDIF
  69. %token UNTERMINATED_STRING
  70. %token <string> CPP_TOENDL STRING WORD
  71. /*-------------------------------------------------------------------------*/
  72. /* grammar */
  73. %%
  74. code: /* empty */ | code stmt ;
  75. stmt:
  76. USE WORD other eostmt
  77. {
  78. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  79. cmDependsFortranParser_RuleUse(parser, $2);
  80. free($2);
  81. }
  82. | include STRING other eostmt
  83. {
  84. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  85. cmDependsFortranParser_RuleInclude(parser, $2);
  86. free($2);
  87. }
  88. | CPP_INCLUDE WORD other eostmt /* Ignore */
  89. | MODULE WORD eostmt
  90. {
  91. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  92. cmDependsFortranParser_RuleModule(parser, $2);
  93. free($2);
  94. }
  95. | define WORD other eostmt
  96. {
  97. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  98. cmDependsFortranParser_RuleDefine(parser, $2);
  99. free($2);
  100. }
  101. | undef WORD other eostmt
  102. {
  103. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  104. cmDependsFortranParser_RuleUndef(parser, $2);
  105. free($2);
  106. }
  107. | ifdef WORD other eostmt
  108. {
  109. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  110. cmDependsFortranParser_RuleIfdef(parser, $2);
  111. free($2);
  112. }
  113. | ifndef WORD other eostmt
  114. {
  115. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  116. cmDependsFortranParser_RuleIfndef(parser, $2);
  117. free($2);
  118. }
  119. | if other eostmt
  120. {
  121. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  122. cmDependsFortranParser_RuleIf(parser);
  123. }
  124. | elif other eostmt
  125. {
  126. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  127. cmDependsFortranParser_RuleElif(parser);
  128. }
  129. | else other eostmt
  130. {
  131. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  132. cmDependsFortranParser_RuleElse(parser);
  133. }
  134. | endif other eostmt
  135. {
  136. cmDependsFortranParser* parser = cmDependsFortran_yyget_extra(yyscanner);
  137. cmDependsFortranParser_RuleEndif(parser);
  138. }
  139. | other eostmt /* Ignore */
  140. ;
  141. eostmt: /* empty */ | EOSTMT ;
  142. include: F_INCLUDE | CPP_INCLUDE | F90PPR_INCLUDE | COCO_INCLUDE ;
  143. define: CPP_DEFINE | F90PPR_DEFINE ;
  144. undef: CPP_UNDEF | F90PPR_UNDEF ;
  145. ifdef: CPP_IFDEF | F90PPR_IFDEF ;
  146. ifndef: CPP_IFNDEF | F90PPR_IFNDEF ;
  147. if: CPP_IF | F90PPR_IF ;
  148. elif: CPP_ELIF | F90PPR_ELIF ;
  149. else: CPP_ELSE | F90PPR_ELSE ;
  150. endif: CPP_ENDIF | F90PPR_ENDIF ;
  151. other: /* empty */ | other misc_code ;
  152. misc_code:
  153. WORD { free ($1); }
  154. | STRING { free ($1); }
  155. | UNTERMINATED_STRING
  156. ;
  157. %%
  158. /* End of grammar */