SList.cpp
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:3k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * SList.C
  3.  *
  4.  * SOFTWARE RIGHTS
  5.  *
  6.  * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public
  7.  * domain.  An individual or company may do whatever they wish with
  8.  * source code distributed with SORCERER or the code generated by
  9.  * SORCERER, including the incorporation of SORCERER, or its output, into
  10.  * commerical software.
  11.  *
  12.  * We encourage users to develop software with SORCERER.  However, we do
  13.  * ask that credit is given to us for developing SORCERER.  By "credit",
  14.  * we mean that if you incorporate our source code into one of your
  15.  * programs (commercial product, research project, or otherwise) that you
  16.  * acknowledge this fact somewhere in the documentation, research report,
  17.  * etc...  If you like SORCERER and have developed a nice tool with the
  18.  * output, please mention that you developed it using SORCERER.  In
  19.  * addition, we ask that this header remain intact in our source code.
  20.  * As long as these guidelines are kept, we expect to continue enhancing
  21.  * this system and expect to make other tools available as they are
  22.  * completed.
  23.  *
  24.  * PCCTS 1.33
  25.  * Terence Parr
  26.  * Parr Research Corporation
  27.  * with Purdue University and AHPCRC, University of Minnesota
  28.  * 1992-1998
  29.  */
  30. #define ANTLR_SUPPORT_CODE
  31. #include "SList.h"
  32. /* Iterate over a list of elements; returns ptr to a new element
  33.  * in list upon every call and NULL when no more are left.
  34.  * Very useful like this:
  35.  *
  36.  * cursor = mylist;
  37.  * while ( (p=mylist->iterate(&cursor)) ) {
  38.  * // place with element p
  39.  * }
  40.  *
  41.  * The cursor must be initialized to point to the list to iterate over.
  42.  */
  43. void *SList::
  44. iterate(SListNode **cursor)
  45. {
  46. void *e;
  47. if ( cursor == NULL || *cursor==NULL ) return NULL;
  48. if ( head == *cursor ) { *cursor = (*cursor)->next(); }
  49. e = (*cursor)->elem();
  50. (*cursor) = (*cursor)->next();
  51. return e;
  52. }
  53. /* add an element to end of list. */
  54. void SList::
  55. add(void *e)
  56. {
  57. SListNode *p, *tail;
  58. require(e!=NULL, "slist_add: attempting to add NULL list element");
  59. p = new SListNode;
  60. require(p!=NULL, "add: cannot alloc new list node");
  61. p->setElem(e);
  62. if ( head == NULL )
  63. {
  64. head = tail = p;
  65. }
  66. else /* find end of list */
  67. {
  68. tail->setNext(p);
  69. tail = p;
  70. }
  71. }
  72. void SList::
  73. lfree()
  74. {
  75. SListNode *p,*q;
  76. if ( head==NULL ) return; /* empty list */
  77. for (p = head; p!=NULL; p=q)
  78. {
  79. q = p->next();
  80. free(p);
  81. }
  82. }
  83. PCCTS_AST *SList::
  84. to_ast(SList list)
  85. {
  86. PCCTS_AST *t=NULL, *last=NULL;
  87. SListNode *p;
  88. for (p = head; p!=NULL; p=p->next())
  89. {
  90. PCCTS_AST *u = (PCCTS_AST *)p->elem();
  91. if ( last==NULL ) last = t = u;
  92. else { last->setRight(u); last = u; }
  93. }
  94. return t;
  95. }