/*
 * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation,
 * YDC Corporation, IPA (Information-technology Promotion Agency, Japan).
 * All rights reserved.
 * 
 * Redistribution and use of this software in source and binary forms, with 
 * or without modification, are permitted provided that the following 
 * conditions and disclaimer are agreed and accepted by the user:
 * 
 * 1. Redistributions of source code must retain the above copyright 
 * notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the following disclaimer in the 
 * documentation and/or other materials provided with the distribution.
 * 
 * 3. Neither the names of the copyrighters, the name of the project which 
 * is related to this software (hereinafter referred to as "project") nor 
 * the names of the contributors may be used to endorse or promote products 
 * derived from this software without specific prior written permission.
 * 
 * 4. No merchantable use may be permitted without prior written 
 * notification to the copyrighters. However, using this software for the 
 * purpose of testing or evaluating any products including merchantable 
 * products may be permitted without any notification to the copyrighters.
 * 
 * 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND 
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING 
 * BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 * FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE 
 * COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $TAHI: v6eval/lib/Cm/CmLexer.h,v 1.14 2003/12/04 04:59:47 akisada Exp $
 */
#ifndef _Cm_CmLexer_h_
#define _Cm_CmLexer_h_ 1
#include "CmTypes.h"
#include "CmString.h"
#include "CmToken.h"
#include <stdio.h>

#if !(defined(__FreeBSD__) && __FreeBSD__ >= 4)

const int32_t	YYERRCODE=256;

#endif

class PObject;
class McObject;
class MvAction;
class MvFunction;
class CmToken;
class CmLexer {
public:
	enum eNumBase {eBB_=0x1,eOO_=0x2,eDD_=0x4,eHH_=0x8};
private:
	FILE* iod_;
	STR current_;
	STR buffer_;
	unsigned int buffer_size;
	int lineNo_;
	CSTR fileName_;
static	CSTR _tag2Fmts[];
static	CSTR _tag1Fmts[];
static	uint32_t errorCount_;
static	uint32_t warningSuppress_;
static	char numTypes_[256];
static	StringSet nameSet_;
static	CmLexer* instance_;
public:
	CmLexer(CSTR);
virtual	~CmLexer();
static	void initialize();
static	CmLexer* instance();
	uint32_t errorCount() const;
//----------------------------------------------------------------------
// ERROR HANDLING
static	void eout(CSTR,int,char,CSTR,va_list);
static	void eouts(CSTR,int,char,CSTR,...);
static	void error(char,CSTR,...);
static	void uerror(CSTR,CSTR);
inline	void yaccError(CSTR s) const;
	CSTR fileName() const;
	int lineNo() const;
	void close();
	STR getLine();
protected:
//----------------------------------------------------------------------
// LEXER TOKEN HANDLING
virtual	STR nextToken();
	STR getLineTag(STR);
virtual	STR controls(STR);
	STR skipComment(STR);
virtual	CSTR nameLex(STR&,CmCString&);
virtual	int32_t digitLex(STR&);
virtual	CSTR stringLex(STR&,CmCString&);
//----------------------------------------------------------------------
// ITERATE BUFFER
	STR continueGetLine();
virtual	STR current() const;
virtual	STR current(STR);
inline	STR next(int32_t=1);
inline	STR buffer();
	STR readCompleteLine(int);
//----------------------------------------------------------------------
// TYPE OPERATION
static	bool isAlpha(int c);
static	bool isAlnum(int c);
static	void initNumTypes();
//----------------------------------------------------------------------
// FILE ATTRIBUTE
	FILE* open(CSTR);
	void fileName(CSTR);
	bool eof();
};
inline STR CmLexer::current() const {return current_;}
inline STR CmLexer::buffer() {return buffer_;}
inline STR CmLexer::current(STR s) {return (current_=s);}
inline STR CmLexer::next(int32_t n) {return (current_+=n);}
inline void CmLexer::yaccError(CSTR s) const {error('E',s);}
inline CmLexer* CmLexer::instance() {return instance_;}
inline uint32_t CmLexer::errorCount() const {return errorCount_;}
inline CSTR CmLexer::fileName() const {return fileName_;}
inline int CmLexer::lineNo() const {return lineNo_;}

extern int yydebug;
#endif


syntax highlighted by Code2HTML, v. 0.9.1