slist.cpp

来自「本工具提供一个词法分析器和语法分析器的集成开发环境」· C++ 代码 · 共 106 行

CPP
106
字号
/* * SList.C * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain.  An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER.  However, we do * ask that credit is given to us for developing SORCERER.  By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc...  If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER.  In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * PCCTS 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1992-1998 */#define ANTLR_SUPPORT_CODE#include "SList.h"/* Iterate over a list of elements; returns ptr to a new element * in list upon every call and NULL when no more are left. * Very useful like this: * *		cursor = mylist; *		while ( (p=mylist->iterate(&cursor)) ) { *			// place with element p *		} * * The cursor must be initialized to point to the list to iterate over. */void *SList::iterate(SListNode **cursor){	void *e;	if ( cursor == NULL || *cursor==NULL ) return NULL;	if ( head == *cursor ) { *cursor = (*cursor)->next(); }	e = (*cursor)->elem();	(*cursor) = (*cursor)->next();	return e;}/* add an element to end of list. */void SList::add(void *e){	SListNode *p, *tail;	require(e!=NULL, "slist_add: attempting to add NULL list element");	p = new SListNode;	require(p!=NULL, "add: cannot alloc new list node");	p->setElem(e);	if ( head == NULL )	{		head = tail = p;	}	else								/* find end of list */	{		tail->setNext(p);		tail = p;	}}void SList::lfree(){	SListNode *p,*q;	if ( head==NULL ) return;	/* empty list */	for (p = head; p!=NULL; p=q)	{		q = p->next();		free(p);	}}PCCTS_AST *SList::to_ast(SList list){	PCCTS_AST *t=NULL, *last=NULL;	SListNode *p;	for (p = head; p!=NULL; p=p->next())	{		PCCTS_AST *u = (PCCTS_AST *)p->elem();		if ( last==NULL ) last = t = u;		else { last->setRight(u); last = u; }	}	return t;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?