gscanner.inc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. {*
  2. * gscanner.inc
  3. *
  4. * depends on ghash.inc
  5. *}
  6. { GScanner: Flexible lexical scanner for general purpose.}
  7. type
  8. PGTokenType = ^TGTokenType;
  9. TGTokenType = gint;
  10. const
  11. G_TOKEN_LEFT_PAREN = 40; // ASCII Code of '('
  12. G_TOKEN_RIGHT_PAREN = 41; // ASCII Code of ')'
  13. G_TOKEN_LEFT_CURLY = 123; // ASCII Code of '{'
  14. G_TOKEN_RIGHT_CURLY = 125; // ASCII Code of '}'
  15. G_TOKEN_LEFT_BRACE = 91; // ASCII Code of '['
  16. G_TOKEN_RIGHT_BRACE = 93; // ASCII Code of ']'
  17. G_TOKEN_EQUAL_SIGN = 61; // ASCII Code of '='
  18. G_TOKEN_COMMA = 44; // ASCII Code of ','
  19. G_TOKEN_NONE = 256;
  20. G_TOKEN_ERROR = 257;
  21. G_TOKEN_CHAR = 258;
  22. G_TOKEN_OCTAL = 260;
  23. G_TOKEN_INT = 261;
  24. G_TOKEN_HEX = 262;
  25. G_TOKEN_FLOAT = 263;
  26. G_TOKEN_STRING = 264;
  27. G_TOKEN_SYMBOL = 265;
  28. G_TOKEN_IDENTIFIER = 266;
  29. G_TOKEN_IDENTIFIER_NULL = 267;
  30. G_TOKEN_COMMENT_SINGLE = 268;
  31. G_TOKEN_COMMENT_MULTI = 269;
  32. G_TOKEN_LAST = 270;
  33. type
  34. PGScanner = ^TGScanner;
  35. PGScannerConfig = ^TGScannerConfig;
  36. PGTokenValue = ^TGTokenValue;
  37. TGTokenValue = record
  38. case longint of
  39. 0 : ( v_symbol : gpointer );
  40. 1 : ( v_identifier : Pgchar );
  41. 2 : ( v_binary : gulong );
  42. 3 : ( v_octal : gulong );
  43. 4 : ( v_int : gulong );
  44. 5 : ( v_float : gdouble );
  45. 6 : ( v_hex : gulong );
  46. 7 : ( v_string : Pgchar );
  47. 8 : ( v_comment : Pgchar );
  48. 9 : ( v_char : guchar );
  49. 10 : ( v_error : guint );
  50. end;
  51. TGScannerMsgFunc = procedure (scanner:PGScanner; message:Pgchar; error:gboolean);cdecl;
  52. TGScanner = record
  53. user_data : gpointer; { unused fields }
  54. max_parse_errors : guint;
  55. parse_errors : guint; { g_scanner_error() increments this field }
  56. input_name : Pgchar; { name of input stream, featured by
  57. the default message handler }
  58. qdata : PGData; { quarked data }
  59. config : PGScannerConfig; { link into the scanner configuration }
  60. token : TGTokenType; { fields filled in after g_scanner_get_next_token() }
  61. value : TGTokenValue;
  62. line : guint;
  63. position : guint;
  64. next_token : TGTokenType; { fields filled in after g_scanner_peek_next_token() }
  65. next_value : TGTokenValue;
  66. next_line : guint;
  67. next_position : guint;
  68. symbol_table : PGHashTable; { to be considered private }
  69. input_fd : gint;
  70. text : Pgchar;
  71. text_end : Pgchar;
  72. buffer : Pgchar;
  73. scope_id : guint;
  74. msg_handler : TGScannerMsgFunc; { handler function for _warn and _error }
  75. end;
  76. TGScannerConfig = record
  77. { Character sets }
  78. cset_skip_characters : Pgchar; { default: " \t\n" }
  79. cset_identifier_first : Pgchar;
  80. cset_identifier_nth : Pgchar;
  81. cpair_comment_single : Pgchar; { default: "#\n" }
  82. flag0 : longint; { Boolean values to be adjusted "on the fly"
  83. to configure scanning behaviour. }
  84. padding_dummy : guint;
  85. end;
  86. { Character sets }
  87. const
  88. G_CSET_A_2_Z_UCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // NOTE: renamed
  89. G_CSET_a_2_z_lcase = 'abcdefghijklmnopqrstuvwxyz'; // dito
  90. G_CSET_DIGITS = '0123456789';
  91. {
  92. How to express an escape sequenced string in pascal???
  93. G_CSET_LATINC = #300 + #301 + #302 + #303 + #304 + #305 + #306 + #307 + #310 + #311 +
  94. #312 + #313 + #314 + #315 + #316 + #317 + #320 + #321 + #322 + #323 +
  95. #324 + #325 + #326 + #330 + #331 + #332 + #333 + #334 + #335 + #336;
  96. G_CSET_LATINS = #337#340#341#342#343#344#345#346#347#350#351#352#353#354#355#356#357#360
  97. #361#362#363#364#365#366#370#371#372#373#374#375#376#377;
  98. This is the original version:
  99. #define G_CSET_LATINC "\300\301\302\303\304\305\306"\
  100. "\307\310\311\312\313\314\315\316\317\320"\
  101. "\321\322\323\324\325\326"\
  102. "\330\331\332\333\334\335\336"
  103. #define G_CSET_LATINS "\337\340\341\342\343\344\345\346"\
  104. "\347\350\351\352\353\354\355\356\357\360"\
  105. "\361\362\363\364\365\366"\
  106. "\370\371\372\373\374\375\376\377"
  107. }
  108. const
  109. bm_TGScannerConfig_case_sensitive = $1;
  110. bp_TGScannerConfig_case_sensitive = 0;
  111. bm_TGScannerConfig_skip_comment_multi = $2;
  112. bp_TGScannerConfig_skip_comment_multi = 1;
  113. bm_TGScannerConfig_skip_comment_single = $4;
  114. bp_TGScannerConfig_skip_comment_single = 2;
  115. bm_TGScannerConfig_scan_comment_multi = $8;
  116. bp_TGScannerConfig_scan_comment_multi = 3;
  117. bm_TGScannerConfig_scan_identifier = $10;
  118. bp_TGScannerConfig_scan_identifier = 4;
  119. bm_TGScannerConfig_scan_identifier_1char = $20;
  120. bp_TGScannerConfig_scan_identifier_1char = 5;
  121. bm_TGScannerConfig_scan_identifier_NULL = $40;
  122. bp_TGScannerConfig_scan_identifier_NULL = 6;
  123. bm_TGScannerConfig_scan_symbols = $80;
  124. bp_TGScannerConfig_scan_symbols = 7;
  125. bm_TGScannerConfig_scan_binary = $100;
  126. bp_TGScannerConfig_scan_binary = 8;
  127. bm_TGScannerConfig_scan_octal = $200;
  128. bp_TGScannerConfig_scan_octal = 9;
  129. bm_TGScannerConfig_scan_float = $400;
  130. bp_TGScannerConfig_scan_float = 10;
  131. bm_TGScannerConfig_scan_hex = $800;
  132. bp_TGScannerConfig_scan_hex = 11;
  133. bm_TGScannerConfig_scan_hex_dollar = $1000;
  134. bp_TGScannerConfig_scan_hex_dollar = 12;
  135. bm_TGScannerConfig_scan_string_sq = $2000;
  136. bp_TGScannerConfig_scan_string_sq = 13;
  137. bm_TGScannerConfig_scan_string_dq = $4000;
  138. bp_TGScannerConfig_scan_string_dq = 14;
  139. bm_TGScannerConfig_numbers_2_int = $8000;
  140. bp_TGScannerConfig_numbers_2_int = 15;
  141. bm_TGScannerConfig_int_2_float = $10000;
  142. bp_TGScannerConfig_int_2_float = 16;
  143. bm_TGScannerConfig_identifier_2_string = $20000;
  144. bp_TGScannerConfig_identifier_2_string = 17;
  145. bm_TGScannerConfig_char_2_token = $40000;
  146. bp_TGScannerConfig_char_2_token = 18;
  147. bm_TGScannerConfig_symbol_2_token = $80000;
  148. bp_TGScannerConfig_symbol_2_token = 19;
  149. bm_TGScannerConfig_scope_0_fallback = $100000;
  150. bp_TGScannerConfig_scope_0_fallback = 20;
  151. { Should symbol lookup work case sensitive? }
  152. function TGScannerConfig_case_sensitive(var a : TGScannerConfig) : guint;
  153. procedure TGScannerConfig_set_case_sensitive(var a : TGScannerConfig; __case_sensitive : guint);
  154. { C-like comment }
  155. function TGScannerConfig_skip_comment_multi(var a : TGScannerConfig) : guint;
  156. procedure TGScannerConfig_set_skip_comment_multi(var a : TGScannerConfig; __skip_comment_multi : guint);
  157. { single line comment }
  158. function TGScannerConfig_skip_comment_single(var a : TGScannerConfig) : guint;
  159. procedure TGScannerConfig_set_skip_comment_single(var a : TGScannerConfig; __skip_comment_single : guint);
  160. { scan multi line comments? }
  161. function TGScannerConfig_scan_comment_multi(var a : TGScannerConfig) : guint;
  162. procedure TGScannerConfig_set_scan_comment_multi(var a : TGScannerConfig; __scan_comment_multi : guint);
  163. function TGScannerConfig_scan_identifier(var a : TGScannerConfig) : guint;
  164. procedure TGScannerConfig_set_scan_identifier(var a : TGScannerConfig; __scan_identifier : guint);
  165. function TGScannerConfig_scan_identifier_1char(var a : TGScannerConfig) : guint;
  166. procedure TGScannerConfig_set_scan_identifier_1char(var a : TGScannerConfig; __scan_identifier_1char : guint);
  167. function TGScannerConfig_scan_identifier_NULL(var a : TGScannerConfig) : guint;
  168. procedure TGScannerConfig_set_scan_identifier_NULL(var a : TGScannerConfig; __scan_identifier_NULL : guint);
  169. function TGScannerConfig_scan_symbols(var a : TGScannerConfig) : guint;
  170. procedure TGScannerConfig_set_scan_symbols(var a : TGScannerConfig; __scan_symbols : guint);
  171. function TGScannerConfig_scan_binary(var a : TGScannerConfig) : guint;
  172. procedure TGScannerConfig_set_scan_binary(var a : TGScannerConfig; __scan_binary : guint);
  173. function TGScannerConfig_scan_octal(var a : TGScannerConfig) : guint;
  174. procedure TGScannerConfig_set_scan_octal(var a : TGScannerConfig; __scan_octal : guint);
  175. function TGScannerConfig_scan_float(var a : TGScannerConfig) : guint;
  176. procedure TGScannerConfig_set_scan_float(var a : TGScannerConfig; __scan_float : guint);
  177. { `0x0ff0' }
  178. function TGScannerConfig_scan_hex(var a : TGScannerConfig) : guint;
  179. procedure TGScannerConfig_set_scan_hex(var a : TGScannerConfig; __scan_hex : guint);
  180. { `$0ff0' }
  181. function TGScannerConfig_scan_hex_dollar(var a : TGScannerConfig) : guint;
  182. procedure TGScannerConfig_set_scan_hex_dollar(var a : TGScannerConfig; __scan_hex_dollar : guint);
  183. { string: 'anything' }
  184. function TGScannerConfig_scan_string_sq(var a : TGScannerConfig) : guint;
  185. procedure TGScannerConfig_set_scan_string_sq(var a : TGScannerConfig; __scan_string_sq : guint);
  186. { string: "\\-escapes!\n" }
  187. function TGScannerConfig_scan_string_dq(var a : TGScannerConfig) : guint;
  188. procedure TGScannerConfig_set_scan_string_dq(var a : TGScannerConfig; __scan_string_dq : guint);
  189. { bin, octal, hex => int }
  190. function TGScannerConfig_numbers_2_int(var a : TGScannerConfig) : guint;
  191. procedure TGScannerConfig_set_numbers_2_int(var a : TGScannerConfig; __numbers_2_int : guint);
  192. { int => G_TOKEN_FLOAT? }
  193. function TGScannerConfig_int_2_float(var a : TGScannerConfig) : guint;
  194. procedure TGScannerConfig_set_int_2_float(var a : TGScannerConfig; __int_2_float : guint);
  195. function TGScannerConfig_identifier_2_string(var a : TGScannerConfig) : guint;
  196. procedure TGScannerConfig_set_identifier_2_string(var a : TGScannerConfig; __identifier_2_string : guint);
  197. { return G_TOKEN_CHAR? }
  198. function TGScannerConfig_char_2_token(var a : TGScannerConfig) : guint;
  199. procedure TGScannerConfig_set_char_2_token(var a : TGScannerConfig; __char_2_token : guint);
  200. function TGScannerConfig_symbol_2_token(var a : TGScannerConfig) : guint;
  201. procedure TGScannerConfig_set_symbol_2_token(var a : TGScannerConfig; __symbol_2_token : guint);
  202. { try scope 0 on lookups? }
  203. function TGScannerConfig_scope_0_fallback(var a : TGScannerConfig) : guint;
  204. procedure TGScannerConfig_set_scope_0_fallback(var a : TGScannerConfig; __scope_0_fallback : guint);
  205. function g_scanner_new(config_templ:PGScannerConfig):PGScanner;cdecl;external gliblib name 'g_scanner_new';
  206. procedure g_scanner_destroy(scanner:PGScanner);cdecl;external gliblib name 'g_scanner_destroy';
  207. procedure g_scanner_input_file(scanner:PGScanner; input_fd:gint);cdecl;external gliblib name 'g_scanner_input_file';
  208. procedure g_scanner_sync_file_offset(scanner:PGScanner);cdecl;external gliblib name 'g_scanner_sync_file_offset';
  209. procedure g_scanner_input_text(scanner:PGScanner; text:Pgchar; text_len:guint);cdecl;external gliblib name 'g_scanner_input_text';
  210. function g_scanner_get_next_token(scanner:PGScanner):TGTokenType;cdecl;external gliblib name 'g_scanner_get_next_token';
  211. function g_scanner_peek_next_token(scanner:PGScanner):TGTokenType;cdecl;external gliblib name 'g_scanner_peek_next_token';
  212. function g_scanner_cur_token(scanner:PGScanner):TGTokenType;cdecl;external gliblib name 'g_scanner_cur_token';
  213. function g_scanner_cur_value(scanner:PGScanner):TGTokenValue;cdecl;external gliblib name 'g_scanner_cur_value';
  214. function g_scanner_cur_line(scanner:PGScanner):guint;cdecl;external gliblib name 'g_scanner_cur_line';
  215. function g_scanner_cur_position(scanner:PGScanner):guint;cdecl;external gliblib name 'g_scanner_cur_position';
  216. function g_scanner_eof(scanner:PGScanner):gboolean;cdecl;external gliblib name 'g_scanner_eof';
  217. function g_scanner_set_scope(scanner:PGScanner; scope_id:guint):guint;cdecl;external gliblib name 'g_scanner_set_scope';
  218. procedure g_scanner_scope_add_symbol(scanner:PGScanner; scope_id:guint; symbol:Pgchar; value:gpointer);cdecl;external gliblib name 'g_scanner_scope_add_symbol';
  219. procedure g_scanner_scope_remove_symbol(scanner:PGScanner; scope_id:guint; symbol:Pgchar);cdecl;external gliblib name 'g_scanner_scope_remove_symbol';
  220. function g_scanner_scope_lookup_symbol(scanner:PGScanner; scope_id:guint; symbol:Pgchar):gpointer;cdecl;external gliblib name 'g_scanner_scope_lookup_symbol';
  221. procedure g_scanner_scope_foreach_symbol(scanner:PGScanner; scope_id:guint; func:TGHFunc; user_data:gpointer);cdecl;external gliblib name 'g_scanner_scope_foreach_symbol';
  222. function g_scanner_lookup_symbol(scanner:PGScanner; symbol:Pgchar):gpointer;cdecl;external gliblib name 'g_scanner_lookup_symbol';
  223. procedure g_scanner_unexp_token(scanner:PGScanner; expected_token:TGTokenType; identifier_spec:Pgchar; symbol_spec:Pgchar; symbol_name:Pgchar;
  224. _message:Pgchar; is_error:gint);cdecl;external gliblib name 'g_scanner_unexp_token';
  225. procedure g_scanner_error(scanner:PGScanner; format:Pgchar);varargs;cdecl;external gliblib name 'g_scanner_error';
  226. procedure g_scanner_warn(scanner:PGScanner; format:Pgchar);varargs;cdecl;external gliblib name 'g_scanner_warn';
  227. {$ifndef G_DISABLE_DEPRECATED}
  228. // { keep downward source compatibility }
  229. // { #define g_scanner_add_symbol( scanner, symbol, value ) G_STMT_START { \ }
  230. // { g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \ }
  231. // { } G_STMT_END }
  232. // { #define g_scanner_remove_symbol( scanner, symbol ) G_STMT_START { \ }
  233. // { g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \ }
  234. // { } G_STMT_END }
  235. // { #define g_scanner_foreach_symbol( scanner, func, data ) G_STMT_START { \ }
  236. // { g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \ }
  237. // { } G_STMT_END }
  238. { The following two functions are deprecated and will be removed in
  239. the next major release. They do no good. }
  240. procedure g_scanner_freeze_symbol_table(scanner : PGScanner);
  241. procedure g_scanner_thaw_symbol_table(scanner : PGScanner);
  242. {$endif} { G_DISABLE_DEPRECATED }