/* vim: ts=4 sw=4 sts=4 ff=unix fenc=utf-8 :
 * =====================================================================
 *  kscript_token.h
 *  Copyright (c)  2003 - 2011  sys0tem
 *  LICENSE :
 *	LGPL (GNU Lesser General Public License - Version 3,29 June 2007)
 *	http://www.gnu.org/copyleft/lesser.html
 *	or
 *	EPL (Eclipse Public License - v1.0)
 *	http://www.eclipse.org/legal/epl-v10.html
 * =====================================================================
 */
#ifndef __KSCRIPT_TOKEN_H__
#define __KSCRIPT_TOKEN_H__

#include <sc_stdbool.h>
#include <sc_list.h>
#include <sc_string.h>

enum TokenType
{
	T_UNKNOWN,				/*< Unknown				*/

	T_EOF,					/*< End Of File			*/
	T_EOL,					/*< End Of Line			*/
	T_SPACE,				/*< Space (\u0020, \u0009, \u000b, \u000c) */
	T_COMMENT,				/*< Comment				*/

	T_IDENTIFIER,			/*< 識別子				*/
	T_STRING,				/*< 文字列リテラル		*/
	T_COMMAND,				/*< コマンドリテラル	*/
	T_CHARACTER,			/*< 文字リテラル		*/
	T_INTEGER,				/*< 整数リテラル		*/
	T_FLOAT,				/*< 浮動少数リテラル	*/
	T_KEYWORD,				/*< キーワード			*/

	T_NOT,					/*< !					*/
	T_NOTE,					/*< !=					*/
	T_NOTLT,				/*< !<					*/
	T_NOTGT,				/*< !>					*/
	T_NOTLTE,				/*< !<=					*/
	T_NOTGTE,				/*< !>=					*/
	T_NOTLTGT,				/*< !<>					*/
	T_NOTLTGTE,				/*< !<>=				*/

	T_LT,					/*< <					*/
	T_ARROWL,				/*< <-					*/
	T_LTE,					/*< <=					*/
	T_LTD,					/*< <<					*/
	T_LTGT,					/*< <>					*/
	T_LTDE,					/*< <<=					*/
	T_LTGTE,				/*< <>=					*/
	T_HTMLCOMMENTS,			/*< <!--				*/

	T_GT,					/*< >					*/
	T_GTE,					/*< >=					*/
	T_GTD,					/*< >>					*/
	T_GTDE,					/*< >>=					*/
	T_GTT,					/*< >>>					*/
	T_GTTE,					/*< >>>=				*/

	T_DOT,					/*< .					*/
	T_DOTD,					/*< ..					*/
	T_DOTT,					/*< ...					*/

	T_AMP,					/*< &					*/
	T_AMPE,					/*< &=					*/
	T_AMPD,					/*< &&					*/

	T_PIPE,					/*< |					*/
	T_PIPEE,				/*< |=					*/
	T_PIPED,				/*< ||					*/

	T_MINUS,				/*< -					*/
	T_MINUSE,				/*< -=					*/
	T_MINUSD,				/*< --					*/
	T_ARROWR,				/*< ->					*/
	T_HTMLCOMMENTE,			/*< -->					*/

	T_PLUS,					/*< +					*/
	T_PLUSE,				/*< +=					*/
	T_PLUSD,				/*< ++					*/

	T_SLASH,				/*< /					*/
	T_SLASHE,				/*< /=					*/

	T_STAR,					/*< *					*/
	T_STARE,				/*< *=					*/

	T_EQUAL,				/*< =					*/
	T_EQUALE,				/*< ==					*/

	T_PARCENT,				/*< %					*/
	T_PARCENTE,				/*< %=					*/

	T_HAT,					/*< ^					*/
	T_HATE,					/*< ^=					*/

	T_TILD,					/*< ~					*/
	T_TILDE,				/*< ~=					*/

	T_HASH,					/*< #					*/
	T_SHELLHEAD,			/*< #!					*/

	T_QUESTION,				/*< ?					*/
	T_PARENL,				/*< (					*/
	T_PARENR,				/*< )					*/
	T_BRACKETL,				/*< [					*/
	T_BRACKETR,				/*< ]					*/
	T_CURLYL,				/*< {					*/
	T_CURLYR,				/*< }					*/
	T_SEMICOLON,			/*< ;					*/
	T_COLON,				/*< :					*/
	T_DOLLAR,				/*< $					*/
	T_AT,					/*< @					*/
	T_ESCAPE 				/*< \					*/
};


enum Keyword
{
	K_UNKNOWN,				/*< no keyword			*/
    K_ABSTRACT,				/*< abstract			*/
    K_ALIAS,				/*< alias				*/
    K_ALIGN,				/*< align				*/
    K_ASM,					/*< asm					*/
    K_ASSERT,				/*< assert				*/
    K_AUTO,					/*< auto				*/
    K_BODY,					/*< body				*/
    K_BOOL,					/*< bool				*/
    K_BREAK,				/*< break				*/
    K_BYTE,					/*< byte				*/
    K_CASE,					/*< case				*/
    K_CAST,					/*< cast				*/
    K_CATCH,				/*< catch				*/
    K_CDOUBLE,				/*< cdouble				*/
    K_CENT,					/*< cent				*/
    K_CFLOAT,				/*< cfloat				*/
    K_CHAR,					/*< char				*/
    K_CLASS,				/*< class				*/
    K_CONST,				/*< const				*/
    K_CONTINUE,				/*< continue			*/
    K_CREAL,				/*< creal				*/
    K_DCHAR,				/*< dchar				*/
    K_DEBUG,				/*< debug				*/
    K_DEFAULT,				/*< default				*/
    K_DELEGATE,				/*< delegate			*/
    K_DELETE,				/*< delete				*/
    K_DEPRECATED,			/*< deprecated			*/
    K_DO,					/*< do					*/
    K_DOUBLE,				/*< double				*/
    K_ELSE,					/*< else				*/
    K_ENUM,					/*< enum				*/
    K_EXPORT,				/*< export				*/
    K_EXTERN,				/*< extern				*/
    K_FALSE,				/*< false				*/
    K_FINAL,				/*< final				*/
    K_FINALLY,				/*< finally				*/
    K_FLOAT,				/*< float				*/
    K_FOR,					/*< for					*/
    K_FOREACH,				/*< foreach				*/
    K_FUNCTION,				/*< function			*/
    K_FOREACH_REVERSE,		/*< foreach_reverse		*/
    K_GOTO,					/*< goto				*/
    K_IDOUBLE,				/*< idouble				*/
    K_IF,					/*< if					*/
    K_IFLOAT,				/*< ifloat				*/
    K_IMPORT,				/*< import				*/
    K_IN,					/*< in					*/
    K_INOUT,				/*< inout				*/
    K_INT,					/*< int					*/
    K_INTERFACE,			/*< interface			*/
    K_INVARIANT,			/*< invariant			*/
    K_IREAL,				/*< ireal				*/
    K_IS,					/*< is					*/
    K_LAZY,					/*< lazy				*/
    K_LONG,					/*< long				*/
    K_MACRO,				/*< macro				*/
    K_MIXIN,				/*< mixin				*/
    K_MODULE,				/*< module				*/
    K_NEW,					/*< new					*/
    K_NOTHROW,				/*< nothrow				*/
    K_NULL,					/*< null				*/
    K_OUT,					/*< out					*/
    K_OVERRIDE,				/*< override			*/
    K_PACKAGE,				/*< package				*/
    K_PRAGMA,				/*< pragma				*/
    K_PRIVATE,				/*< private				*/
    K_PROTECTED,			/*< protected			*/
    K_PUBLIC,				/*< public				*/
    K_PURE,					/*< pure				*/
    K_REAL,					/*< real				*/
    K_REF,					/*< ref					*/
    K_RETURN,				/*< return				*/
    K_SCOPE,				/*< scope				*/
    K_SHARED,				/*< shared				*/
    K_SHORT,				/*< short				*/
    K_STATIC,				/*< static				*/
    K_STRUCT,				/*< struct				*/
    K_SUPER,				/*< super				*/
    K_SWITCH,				/*< switch				*/
    K_SYNCHRONIZED,			/*< synchronized		*/
    K_TEMPLATE,				/*< template			*/
    K_THIS,					/*< this				*/
    K_THROW,				/*< throw				*/
    K_TRUE,					/*< true				*/
    K_TRY,					/*< try					*/
    K_TYPEDEF,				/*< typedef				*/
    K_TYPEID,				/*< typeid				*/
    K_TYPEOF,				/*< typeof				*/
    K_UBYTE,				/*< ubyte				*/
    K_UCENT,				/*< ucent				*/
    K_UINT,					/*< uint				*/
    K_ULONG,				/*< ulong				*/
    K_UNION,				/*< union				*/
    K_UNITTEST,				/*< unittest			*/
    K_USHORT,				/*< ushort				*/
    K_VERSION,				/*< version				*/
    K_VOID,					/*< void				*/
    K_VOLATILE,				/*< volatile			*/
    K_WCHAR,				/*< wchar				*/
    K_WHILE,				/*< while				*/
    K_WITH,					/*< with				*/
    K___FILE__,				/*< __FILE__			*/
    K___LINE__,				/*< __LINE__			*/
    K___GSHARED,			/*< __gshared			*/
    K___THREAD,				/*< __thread			*/
    K___TRAITS				/*< __traits			*/
};


typedef struct {
	enum  TokenType tokenType;		/*< トークン種別	*/
	enum  Keyword   tokenKeyword;	/*< キーワード		*/
	SC_String*  tokenString;	/*< トークン文字列	*/
	int				lineNumber;		/*< 行番号			*/
} KScriptToken;


typedef struct {
	SC_List*   token;				/*< トークンリスト				*/
	SC_String* tmpBuff;				/*< 一時使用バッファ			*/
	char*      ptr;					/*< 現在の解析位置				*/
	bool       isNowBlockComment;	/*< 現在コメントブロック中か	*/
	int        nestingComment;		/*< ネストコメントカウント		*/
} KScriptTokenStatus;



#ifdef __cplusplus
extern "C" {
#endif

void KScript_parseLine(KScriptTokenStatus* status, char* line, int lineNum);

#ifdef __cplusplus
}
#endif


#endif	/* __KSCRIPT_TOKEN_H__ */

