scan.l 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. %{
  2. {
  3. Copyright (c) 1998-2000 by Florian Klaempfl
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************}
  16. unit scan;
  17. {$H+}
  18. {$GOTO ON}
  19. interface
  20. uses strings,scanbase, h2plexlib,h2pyacclib;
  21. function yylex : integer;
  22. function act_token : string;
  23. implementation
  24. uses h2poptions, converu;
  25. Procedure HandleCPlusPlus (aValue : integer); inline;
  26. begin
  27. if NotInCPlusBlock then return(aValue) else skip_until_eol;
  28. end;
  29. %}
  30. D [0-9]
  31. %%
  32. "/*" HandleMultiLineComment;
  33. "//" HandleSingleLineComment;
  34. \"[^\"]*\" HandleCPlusPlus(CSTRING);
  35. \'[^\']*\' HandleCPlusPlus(CSTRING);
  36. "L"\"[^\"]*\" CheckLongString;
  37. "L"\'[^\']*\' CheckLongString;
  38. {D}+[Uu]?[Ll]?[Ll]? HandleLongInteger;
  39. "0x"[0-9A-Fa-f]*[Uu]?[Ll]?[Ll]?
  40. HandleHexLongInteger;
  41. {D}+(\.{D}+)?([Ee][+-]?{D}+)?
  42. HandleNumber;
  43. "->" HandleDeref;
  44. "-" HandleCPlusPlus(MINUS);
  45. "==" HandleCPlusPlus(EQUAL);
  46. "!=" HandleCPlusPlus(UNEQUAL);
  47. ">=" HandleCPlusPlus(GTE);
  48. "<=" HandleCPlusPlus(LTE);
  49. ">>" HandleCPlusPlus(_SHR);
  50. "##" HandleCPlusPlus(STICK);
  51. "<<" HandleCPlusPlus(_SHL);
  52. ">" HandleCPlusPlus(GT);
  53. "<" HandleCPlusPlus(LT);
  54. "|" HandleCPlusPlus(_OR);
  55. "&" HandleCPlusPlus(_AND);
  56. "~" HandleCPlusPlus(_NOT); (* inverse, but handled as not operation *)
  57. "!" HandleCPlusPlus(_NOT);
  58. "/" HandleCPlusPlus(_SLASH);
  59. "+" HandleCPlusPlus(_PLUS);
  60. "?" HandleCPlusPlus(QUESTIONMARK);
  61. ":" HandleCPlusPlus(COLON);
  62. "," HandleCPlusPlus(COMMA);
  63. "[" HandleCPlusPlus(LECKKLAMMER);
  64. "]" HandleCPlusPlus(RECKKLAMMER);
  65. "(" if NotInCPlusBlock then
  66. begin
  67. inc(arglevel);
  68. return(LKLAMMER);
  69. end
  70. else
  71. skip_until_eol;
  72. ")" if NotInCPlusBlock then
  73. begin
  74. dec(arglevel);
  75. return(RKLAMMER);
  76. end
  77. else
  78. skip_until_eol;
  79. "*" HandleCPlusPlus(STAR);
  80. "..." HandleCPlusPlus(ELLIPSIS);
  81. "." if NotInCPlusBlock then
  82. if in_define then
  83. return(POINT)
  84. else
  85. return(256);
  86. "=" HandleCPlusPlus(_ASSIGN);
  87. "extern" HandleCPlusPlus(EXTERN);
  88. "STDCALL" HandleCallingConvention(STDCALL);
  89. "CDECL" HandleCallingConvention(CDECL);
  90. "PASCAL" HandleCallingConvention(PASCAL);
  91. "PACKED" HandleCallingConvention(_PACKED); // Not exactly calling convention, but follows same logic.
  92. "WINAPI" HandleCallingConvention(WINAPI);
  93. "SYS_TRAP" HandlePalmPilotCallingConvention;
  94. "WINGDIAPI" HandleCallingConvention(WINGDIAPI);
  95. "CALLBACK" HandleCallingConvention(CALLBACK);
  96. "EXPENTRY" HandleCallingConvention(CALLBACK); // Callback, really ?
  97. "void" HandleCPlusPlus(VOID);
  98. "VOID" HandleCPlusPlus(VOID);
  99. "#ifdef"[ \t]*"__cplusplus"[ \t]*\n"extern \"C\" {"\n"#endif"
  100. HandlePreProcStripConditional(False);
  101. "#ifdef"[ \t]*"cplusplus"[ \t]*\n"extern \"C\" {"\n"#endif"
  102. HandlePreProcStripConditional(False);
  103. "#ifdef"[ \t]*"__cplusplus"[ \t]*\n"}"\n"#endif"
  104. HandlePreProcStripConditional(True);
  105. "#ifdef"[ \t]*"cplusplus"[ \t]*\n"}"\n"#endif"
  106. HandlePreProcStripConditional(True);
  107. "#ifdef"[ \t]*"cplusplus"[ \t]*
  108. EnterCplusplus;
  109. "#ifdef"[ \t]*"__cplusplus"[ \t]*
  110. EnterCplusplus;
  111. "#ifdef"[ \t] HandlePreProcIfDef;
  112. "#"[ \t]*"else" HandlePreProcElse;
  113. "#"[ \t]*"endif" HandlePreProcEndif;
  114. "#"[ \t]*"elif" HandlePreProcElif;
  115. "#"[ \t]*"undef" HandlePreProcUndef;
  116. "#"[ \t]*"error" HandlePreProcError;
  117. "#"[ \t]*"include" HandlePreProcInclude;
  118. "#"[ \t]*"if" HandlePreProcIf;
  119. "# "[0-9]+" " HandlePreProcLineInfo;
  120. "#"[ \t]*"pragma" HandlePreprocPragma;
  121. "#"[ \t]*"define" HandlePreProcDefine;
  122. "char" HandleCPlusPlus(_CHAR);
  123. "union" HandleCPlusPlus(UNION);
  124. "enum" HandleCPlusPlus(ENUM);
  125. "struct" HandleCPlusPlus(STRUCT);
  126. "{" HandleCPlusPlus(LGKLAMMER);
  127. "}" HandleCPlusPlus(RGKLAMMER);
  128. "typedef" HandleCPlusPlus(TYPEDEF);
  129. "int" HandleCPlusPlus(INT);
  130. "short" HandleCPlusPlus(SHORT);
  131. "long" HandleCPlusPlus(LONG);
  132. "signed" HandleCPlusPlus(SIGNED);
  133. "unsigned" HandleCPlusPlus(UNSIGNED);
  134. "__int8" HandleCPlusPlus(INT8);
  135. "__int16" HandleCPlusPlus(INT16);
  136. "__int32" HandleCPlusPlus(INT32);
  137. "__int64" HandleCPlusPlus(INT64);
  138. "int8" HandleCPlusPlus(INT8);
  139. "int16" HandleCPlusPlus(INT16);
  140. "int32" HandleCPlusPlus(INT32);
  141. "int64" HandleCPlusPlus(INT64);
  142. "float" HandleCPlusPlus(FLOAT);
  143. "const" HandleCPlusPlus(_CONST);
  144. "CONST" HandleCPlusPlus(_CONST);
  145. "FAR" HandleCPlusPlus(_FAR);
  146. "far" HandleCPlusPlus(_FAR);
  147. "NEAR" HandleCPlusPlus(_NEAR);
  148. "near" HandleCPlusPlus(_NEAR);
  149. "HUGE" HandleCPlusPlus(_HUGE);
  150. "huge" HandleCPlusPlus(_HUGE);
  151. "while" HandleCPlusPlus(_WHILE);
  152. [A-Za-z_][A-Za-z0-9_]* HandleIdentifier;
  153. ";" HandleCPlusPlus(SEMICOLON);
  154. [ \f\t] HandleWhiteSpace;
  155. \n HandleEOL;
  156. \\$ HandleContinuation;
  157. . HandleIllegalCharacter;
  158. %%
  159. function act_token : string;
  160. begin
  161. act_token:=yytext;
  162. end;
  163. end.