gs_parser.c
上传用户:mei_mei897
上传日期:2007-01-05
资源大小:82k
文件大小:8k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* gs_parser.c */
  5. /* */
  6. /*  Copyright (C) 1997,1998 Angelo Masci */
  7. /* */
  8. /*  This library is free software; you can redistribute it and/or */
  9. /*  modify it under the terms of the GNU Library General Public */
  10. /*  License as published by the Free Software Foundation; either */
  11. /*  version 2 of the License, or (at your option) any later version. */
  12. /* */
  13. /*  This library is distributed in the hope that it will be useful, */
  14. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  15. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
  16. /*  Library General Public License for more details. */
  17. /* */
  18. /*  You should have received a copy of the GNU Library General Public */
  19. /*  License along with this library; if not, write to the Free */
  20. /*  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  21. /* */
  22. /*  You can contact the author at this e-mail address: */
  23. /* */
  24. /*  angelo@styx.demon.co.uk */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id$
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include <ctype.h>
  32. #include <stdlib.h>
  33. #include "common.h"
  34. #include "logfile.h"
  35. #include "gs_token.h"
  36. #include "gs_parser.h"
  37. /* -------------------------------------------------------------------- */
  38. /* -------------------------------------------------------------------- */
  39. int parse_dictionary(TOKEN_HEAP *heap)
  40. {
  41. TOKEN_ID
  42. token_id;
  43. lprintf(LOG_VERYVERBOSE, "Entering parse_dictionary()n");
  44. token_id = get_next_token(heap);
  45. if (token_id == lcurly_tok)
  46. {
  47. if (parse_dictionary_items(heap))
  48. {
  49. token_id = get_next_token(heap);
  50. if (token_id == rcurly_tok)
  51. { return TRUE;
  52. }
  53. else
  54. { lprintf(LOG_ERROR, "Expecting '}'n");
  55. return FALSE;
  56. }
  57. }
  58. else
  59. { lprintf(LOG_ERROR, "Expecting Dictionary itemsn");
  60. return FALSE;
  61. }
  62. }
  63. else
  64. {
  65. lprintf(LOG_ERROR, "Expecting '{'n");
  66. return FALSE;
  67. }
  68. return TRUE;
  69. }
  70. /* -------------------------------------------------------------------- */
  71. /* -------------------------------------------------------------------- */
  72. int parse_list(TOKEN_HEAP *heap)
  73. {
  74. TOKEN_ID
  75. token_id;
  76. lprintf(LOG_VERYVERBOSE, "Entering parse_list()n");
  77. token_id = get_next_token(heap);
  78. if (token_id == lparen_tok)
  79. {
  80. if (parse_list_items(heap, 0))
  81. {
  82. token_id = get_next_token(heap);
  83. if (token_id == rparen_tok)
  84. { return TRUE;
  85. }
  86. else
  87. { lprintf(LOG_ERROR, "Expecting ')'n");
  88. return FALSE;
  89. }
  90. }
  91. else
  92. { lprintf(LOG_ERROR, "Expecting List itemsn");
  93. return FALSE;
  94. }
  95. }
  96. else
  97. {
  98. lprintf(LOG_ERROR, "Expecting '('n");
  99. return FALSE;
  100. }
  101. return TRUE;
  102. }
  103. /* -------------------------------------------------------------------- */
  104. /* -------------------------------------------------------------------- */
  105. int parse_list_items(TOKEN_HEAP *heap, int depth)
  106. {
  107. TOKEN_ID
  108. token_id,
  109. identifier;
  110. TOKEN_HEAP
  111. *dictionary,
  112. *list;
  113. char buf[16],
  114. *string;
  115. lprintf(LOG_VERYVERBOSE, "Entering parse_list_items()n");
  116. sprintf(buf, "[%d]", depth);
  117. identifier = add_token(heap, buf, T_IDENTIFIER, NULL);
  118. depth++;
  119. token_id = get_next_token(heap);
  120. if (token_id == lcurly_tok)
  121. {
  122. dictionary = generate_new_heap();
  123. if (dictionary == NULL)
  124. { lprintf(LOG_ERROR, "Allocating memoryn");
  125. return FALSE;
  126. }
  127. token_assign_dictionary(heap, identifier, dictionary);
  128. push_back_token(token_id);
  129. if (parse_dictionary(dictionary))
  130. {
  131. token_id = get_next_token(heap);
  132. if (token_id == comma_tok)
  133. {
  134. return parse_list_items(heap, depth);
  135. }
  136. else
  137. { push_back_token(token_id);
  138. return TRUE;
  139. }
  140. }
  141. else
  142. { lprintf(LOG_ERROR, "Failed parsing Dictionaryn");
  143. return FALSE;
  144. }
  145. }
  146. else
  147. if (token_id == lparen_tok)
  148. {
  149. list = generate_new_heap();
  150. if (list == NULL)
  151. { lprintf(LOG_ERROR, "Allocating memoryn");
  152. return FALSE;
  153. }
  154. token_assign_list(heap, identifier, list);
  155. push_back_token(token_id);
  156. if(parse_list(list))
  157. {
  158. token_id = get_next_token(heap);
  159. if (token_id == comma_tok)
  160. {
  161. return parse_list_items(heap, depth);
  162. }
  163. else
  164. { push_back_token(token_id);
  165. return TRUE;
  166. }
  167. }
  168. else
  169. { lprintf(LOG_ERROR, "Failed parsing Listn");
  170. return FALSE;
  171. }
  172. }
  173. else
  174. if (get_token_type(heap, token_id) == T_STRING)
  175. {
  176. string = get_token_strvalue(heap, token_id);
  177. token_assign_value(heap, identifier, string);
  178. token_id = get_next_token(heap);
  179. if (token_id == comma_tok)
  180. {
  181. return parse_list_items(heap, depth);
  182. }
  183. else
  184. { push_back_token(token_id);
  185. return TRUE;
  186. }
  187. }
  188. else
  189. {
  190. lprintf(LOG_ERROR, "Expecting Identifier, Dictionary or Listn");
  191. return FALSE;
  192. }
  193. return TRUE; 
  194. }
  195. /* -------------------------------------------------------------------- */
  196. /* -------------------------------------------------------------------- */
  197. int parse_dictionary_items(TOKEN_HEAP *heap)
  198. {
  199. TOKEN_ID
  200. token_id,
  201. identifier;
  202. TOKEN_HEAP
  203. *dictionary,
  204. *list;
  205. char *string;
  206. lprintf(LOG_VERYVERBOSE, "Entering parse_dictionary_items()n");
  207. token_id = get_next_token(heap);
  208. if (get_token_type(heap, token_id) == T_IDENTIFIER)
  209. {
  210. identifier = token_id;
  211. token_id = get_next_token(heap);
  212. if (token_id == assignment_tok)
  213. {
  214. token_id = get_next_token(heap);
  215. if (token_id == lcurly_tok)
  216. {
  217. dictionary = generate_new_heap();
  218. if (dictionary == NULL)
  219. { lprintf(LOG_ERROR, "Allocating memoryn");
  220. return FALSE;
  221. }
  222. token_assign_dictionary(heap, identifier, dictionary);
  223. push_back_token(token_id);
  224. if (parse_dictionary(dictionary))
  225. {
  226. token_id = get_next_token(heap);
  227. if (token_id == semicolon_tok)
  228. {
  229. token_id = get_next_token(heap);
  230. if (token_id != rcurly_tok)
  231. {
  232. push_back_token(token_id);
  233. return parse_dictionary_items(heap);
  234. }
  235. else
  236. { push_back_token(token_id);
  237. return TRUE;
  238. }
  239. }
  240. else
  241. { lprintf(LOG_ERROR, "Failed parsing dictionary items semicolon expectedn");
  242. return FALSE;
  243. }
  244. }
  245. else
  246. { lprintf(LOG_ERROR, "Failed parsing Dictionaryn");
  247. return FALSE;
  248. }
  249. }
  250. else
  251. if (token_id == lparen_tok)
  252. {
  253. list = generate_new_heap();
  254. if (list == NULL)
  255. { lprintf(LOG_ERROR, "Allocating memoryn");
  256. return FALSE;
  257. }
  258. token_assign_list(heap, identifier, list);
  259. push_back_token(token_id);
  260. if(parse_list(list))
  261. {
  262. token_id = get_next_token(heap);
  263. if (token_id == semicolon_tok)
  264. {
  265. token_id = get_next_token(heap);
  266. if (token_id != rcurly_tok)
  267. {
  268. push_back_token(token_id);
  269. return parse_dictionary_items(heap);
  270. }
  271. else
  272. { push_back_token(token_id);
  273. return TRUE;
  274. }
  275. }
  276. else
  277. { lprintf(LOG_ERROR, "Failed parsing dictionary items semicolon expectedn");
  278. return FALSE;
  279. }
  280. }
  281. else
  282. { lprintf(LOG_ERROR, "Failed parsing Listn");
  283. return FALSE;
  284. }
  285. }
  286. else
  287. if (get_token_type(heap, token_id) == T_STRING)
  288. {
  289. string = get_token_strvalue(heap, token_id);
  290. token_assign_value(heap, identifier, string);
  291. token_id = get_next_token(heap);
  292. if (token_id == semicolon_tok)
  293. {
  294. token_id = get_next_token(heap);
  295. if (token_id != rcurly_tok)
  296. {
  297. push_back_token(token_id);
  298. return parse_dictionary_items(heap);
  299. }
  300. else
  301. { push_back_token(token_id);
  302. return TRUE;
  303. }
  304. }
  305. else
  306. { lprintf(LOG_ERROR, "Failed parsing dictionary items semicolon expectedn");
  307. return FALSE;
  308. }
  309. }
  310. else
  311. {
  312. lprintf(LOG_ERROR, "Expecting Identifier, Dictionary or Listn");
  313. return FALSE;
  314. }
  315. }
  316. else
  317. {
  318. lprintf(LOG_ERROR, "Expecting '='n");
  319. return FALSE;
  320. }
  321. }
  322. else
  323. {
  324. lprintf(LOG_ERROR, "Expecting Identifiern");
  325. return FALSE;
  326. }
  327. return TRUE;
  328. }