/**
 **	 Interpreter (JJTree & Visitor)
 **/

options {
	STATIC=false;
	UNICODE_INPUT=true;
	DEBUG_PARSER=true;
	MULTI=true;
	VISITOR=true;
}

PARSER_BEGIN(IntVParser)
import java.util.Hashtable;

public class IntVParser {
	Hashtable symTable = new Hashtable();
	public int nParseErrors = 0;
}

PARSER_END(IntVParser)

TOKEN_MGR_DECLS :
{
	public int nLexicalErrors = 0;
}

SKIP :
{
	" "
	|	"\t"
//	|	"\n"
	|	"\r"
	|	"\f"
	|	"|"
	|	"�b"
	|	"�@"
}

TOKEN :
{
	< ADDOP: "�{" | "+" >
	|	< SUBOP: "�|" | "-" >
	|	< MULOP: "�~" | "*" >
	|	< DIVOP: "��" | "/" >
	|	< SUROP: "��" | "%" >
	|	< ASGNOP: "��" | ":=" >
	|	< INOP: "->">
	|	< EQOP: "��" | "=" >
	|	< GTOP: "��" | ">" >
	|	< GEOP: "��" | ">=" >
	|	< LSOP: "��" | "<" >
	|	< LEOP: "��" | "<=" >
	|	< NTOP: "��" | "!=" >
	|	< ANDOP: "����" >
	|	< OROP: "�܂���" >
	|	< NOTOP: "�łȂ�" >
	|	< LC: "{" >
	|	< RC: "}" >
	|	< LD: "[" >
	|	< RD: "]" >
	|	< LP: "(" >
	|	< RP: ")" >
	|	< SM: "\n" >
	|	< CM: "," | "�C" | "�A" >
	|	< CM2: "��" >
	|	< PN: "." >
	|	< EOF_STR: "EOF" >
	|	< NULL_STR: "NULL" >
}

TOKEN [IGNORE_CASE] :
{
	< VARINT: "����" >
	|	< VARFLOAT	: "����" >
	|	< VARSTRING	: "������" >
	|	< PROCEDURAL	: "�葱��" >
	|	< ENDPROCEDURAL	: "�葱���I��" >
	|	< FUNCTION	: "�֐�" >
	|	< ENDFUNCTION	: "�֐��I��" >
	|	< RETURN	: "��Ԃ�" >
	|	< IF		: "����" >
	|	< ENDIF		: "��" ( "���s����" | "���s" ) >
	|	< THEN		: ( "�Ȃ��" | "�Ȃ�" ) >
	|	< ELSE		: "�����s��" <CM> "������" ( "�Ȃ����" | "�Ȃ��Ȃ�" | "�Ȃ��Ȃ��" ) >
	|	< ELSEIF	: "�����s��" <CM> ( "�����łȂ�" | "�����łȂ���" ) >
	|	< WHILE		: "�̊�" <CM> >
	|	< DOWHILE	: ( "�J��Ԃ�" | "�J�Ԃ�" ) <CM> >
	|	< DOWHILE2	: "��" <CM> >
	|	< DOWHILE3	: "�ɂȂ�܂�" ( "���s����" | "���s" ) >
	|	< FOR		: "��" >
	|	< FOR2		: "����" >
	|	< FOR3		: "�܂�" >
	|	< FOR4		: "����" >
	|	< FORADD	: "���₵" ( "�Ȃ���" | "�‚�" ) <CM> >
	|	< FORSUB	: "���炵" ( "�Ȃ���" | "�‚�" ) <CM> >
	|	< ENDLOOP	: "��" ( "�J��Ԃ�" | "�J�Ԃ�" ) >
	|	< PUTLN		: "��" ("���" | "�o��" ) "����" >
	|	< PUT		: "�����s" ("�Ȃ�" | "����") "��" ("���" | "�o��" ) "����">
	|	< GET		: "input" <LP> >
	|	< RANDOM	: "random" <LP> >
	|	< SIN		: "sin" <LP> >
	|	< COS		: "cos" <LP> >
	|	< TAN		: "tan" <LP> >
	|	< SQRT		: "sqrt" <LP> >
	|	< FLOOR		: "floor" <LP> >
	|	< CEIL		: "ceil" <LP> >
	|	< ROUND		: "round" <LP> >
	|	< ABS		: "abs" <LP> >
	|	< INT		: "int" <LP> >
	|	< LOG		: "log" <LP> >
	|	< LENGTH	: "length" <LP> >
	|	< SUBSTRING	: "substring" <LP> >
	|	< INSERT	: "insert" <LP> >
	|	< REPLACE	: "replace" <LP> >
	|	< EXTRACT	: "extract" <LP> >
	|	< gWindowOpen	: "gWindowOpen"	<LP> >
	|	< gWindowClose	: "gWindowClose"<LP> >
	|	< gColor	: "gColor"	<LP> >
	|	< gDrawOval	: "gDrawOval"	<LP> >
	|	< gDrawPoint	: "gDrawPoint"	<LP> >
	|	< gFillOval	: "gFillOval"	<LP> >
	|	< gFillPoint	: "gFillPoint"	<LP> >
	|	< gDrawLine	: "gDrawLine"	<LP> >
	|	< gDrawBox	: "gDrawBox"	<LP> >
	|	< gFillBox	: "gFillBox"	<LP> >
	|	< gDrawArc	: "gDrawArc"	<LP> >
	|	< gFillArc	: "gFillArc"	<LP> >
	|	< OPENR		: "openr" <LP> >
	|	< OPENW		: "openw" <LP> >
	|	< OPENA		: "opena" <LP> >
	|	< CLOSE		: "close" <LP> >
	|	< GETSTR	: "getstr" <LP> >
	|	< GETLINE	: "getline" <LP> >
	|	< PUTSTR	: "putstr" <LP> >
	|	< PUTLINE	: "putline" <LP> >
	|	< FLUSH		: "flush" <LP> >
	|	< ISFILE	: "isfile" <LP> >
	|	< RENAME	: "rename" <LP> >
	|	< REMOVE	: "remove" <LP> >
}

TOKEN :
{
	< #DIGIT: [ "0"-"9"] >
	|	< #LETTER: [ "a"-"z", "A"-"Z", "_" ] >
}

TOKEN :
{
	< LITERAL: (<DIGIT>)+ >
	|	< FLOAT_LITERAL: <LITERAL> (<PN> <LITERAL>) >
	|	< IDENT: <LETTER> (<LETTER>|<DIGIT>)* >
		{	int idx;
			int len = image.length();
			if (!Character.isJavaIdentifierStart(image.charAt(0))) {
				++nLexicalErrors;
				new ConsoleAppend(
					"### " + matchedToken.beginLine + "�s�ڂ�"
					+ "�G���[�ł� : \""
					+ matchedToken.image.charAt(0)
					+ "\"("
					+ Integer.toHexString(matchedToken.image.charAt(0))
					+ ")\n"
				);
			}
			for (idx = 1; idx < len; ++idx) {
				if (!Character.isJavaIdentifierPart(image.charAt(idx))) {
					++nLexicalErrors;
					new ConsoleAppend(
						"### " + matchedToken.beginLine + "�s�ڂ�"
						+ "�G���[�ł� : \""
						+ matchedToken.image.charAt(idx)
						+ "\"("
						+ Integer.toHexString(matchedToken.image.charAt(idx))
						+ ")\n"
					);
				}
			}
		}
}

MORE:
{
	< "\""| "�u"> :STR
}
<STR>TOKEN:
{
	< STRLIT: "\"" | "�v" |"\r\n" >
		{
			if ( (image.charAt(0) == '\"' && image.charAt(image.length()-1) == '\"') ||
			 (image.charAt(0) == '�u' && image.charAt(image.length()-1) == '�v') ){
				matchedToken.image = image.substring(1, image.length()-1);
			}else{
				++nLexicalErrors;
				matchedToken.image = image.substring(1, image.length()-2);
				new ConsoleAppend(
					"### " + matchedToken.beginLine + "�s�ڂ�"
					+ "�o�͕���[\"] ��[ �v]��Y��Ă��܂��񂩁H\n"
				);
			}
		}
		:DEFAULT
}
<STR>MORE:
{
	< "\\\"" | "\\�v" | "\\�u" >
		{	image.deleteCharAt(image.length() - 2); }
}
<STR>MORE:
{
	< "\\n" >
		{
			image.delete(image.length() - 2, image.length());
			image.append('\n');
		}
}
<STR>MORE:
{
	< ~[] >
}

MORE:
{
	"/*" :COMM
}
<COMM>SPECIAL_TOKEN:
{
	< COMMENT: "*/" > :DEFAULT
}
<COMM>MORE:
{
	< ~[] >
}

SKIP :
{
	< ~[] >
		{
			++nLexicalErrors;
			new ConsoleAppend(
				"### " + input_stream.getBeginLine() + "�s�ڂ�"
				+ "�G���[�ł� : '" + image + "'\n"
			);
		}
}

void IntVUnit() :
{	Token t; }
{
	(
		try {
			VarDecl()
			|	Function()
			|	Stat()
			|	<EOF>
				{ return; }
			|	ErrorOccur()
		} catch (ParseException e) {
			++nParseErrors;
			new ConsoleAppend("### " + e.getMessage() + "\n");
			throw new ParseException();
			do {
				t = getNextToken();
			} while (t.kind != SM && t.kind != RC && t.kind != EOF);
		}
	)*
}

JAVACODE
void ErrorOccur() {
	ParseException e = generateParseException();
	throw e;
}

void Function() :
{ Token t; }
{
	( 
		<FUNCTION> (
			<VARINT>		{ jjtn000.decl = 1; }
			|	<VARFLOAT>	{ jjtn000.decl = 2; }
			|	<VARSTRING>	{ jjtn000.decl = 3; }
		)
		t=<IDENT> <LP> [ FunctionVar() ] <RP> { jjtn000.line_num1 = jj_consume_token(SM).beginLine; }
		( VarDecl() | Stat() )* #Block <ENDFUNCTION>
		|	<PROCEDURAL>	{ jjtn000.decl = 0; }
		t=<IDENT> <LP> [ FunctionVar() ] <RP> { jjtn000.line_num1 = jj_consume_token(SM).beginLine; }
		( VarDecl() | Stat() )* #Block <ENDPROCEDURAL>
		
	)
	
	{ jjtn000.line_num2 = jj_consume_token(SM).beginLine; }
		{
			if (!symTable.containsKey(t.image)) {
				symTable.put(t.image, new Object());
				jjtThis.varName = t.image;
			} else {
				new ConsoleAppend(
					"### " + t.beginLine + "�s�ڂ� \""
					+ t.image + "\" �͊��ɕϐ��Ƃ��Đ錾����Ă��܂�\"\n"
				);
				throw new ParseException();
			}
		}
}

void FunctionVar() :
{}
{
	(
		<VARINT>	{ jjtn000.decl = 1; }
		| <VARFLOAT>	{ jjtn000.decl = 2; }
		| <VARSTRING>	{ jjtn000.decl = 3; }
	) Decl() [ <CM> FunctionVar() ]
}

void VarDecl() :
{}
{
	(
		<VARINT>	{ jjtn000.decl = 1; }
		| <VARFLOAT>	{ jjtn000.decl = 2; }
		| <VARSTRING>	{ jjtn000.decl = 3; }
	) Decl() ( <CM> Decl() )* { 
				jjtn000.line_num1 = jj_consume_token(SM).beginLine;
			}
}

void Decl() :
{	Token t; }
{
	t=<IDENT> [ <LD> Array() <RD> ]
		{
			symTable.put(t.image, new Object());
			jjtThis.varName = t.image;
			/*
			if (!symTable.containsKey(t.image)) {
				symTable.put(t.image, new Object());
				jjtThis.varName = t.image;
			} else {
				new ConsoleAppend(
					"### " + t.beginLine + "�s�ڂ� \""
					+ t.image + "\" �͊��ɕϐ��Ƃ��Đ錾����Ă��܂�\"\n"
				);
				throw new ParseException();
			}
			*/
		}
}

void Array() :
{}
{	AddExpr() [ <CM> Array() ]
}

void Stat() #void :
{}
{
	LOOKAHEAD(10) AssignStats()
	|	IfStat()
	|	LOOKAHEAD(10) WhileStat()
	|	RepeatUntil()
	|	LOOKAHEAD(10) ForStat()
//	|	GetStat()
	|	LOOKAHEAD(10) PutStat()
	|	LOOKAHEAD(10) Return()
//	|	Block()
	|	gWindowOpen()
	|	gWindowClose()
	|	gColor()
	|	gDrawOval()
	|	gDrawPoint()
	|	gFillOval()
	|	gFillPoint()
	|	gDrawLine()
	|	gDrawBox()
	|	gFillBox()
	|	gDrawArc()
	|	gFillArc()
	|	File_close()
	|	File_putstr()
	|	File_putline()
	|	File_flush()
	|	File_rename()
	|	File_remove()
	|	FunctionCall()
	|	<SM>
}

void AssignStats() :
{}
{
	AssignStat() ( <CM> AssignStat() )* {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void AssignStat() :
{}
{
	  Ident() <ASGNOP> AddExpr()
}

void IfStat() :
{}
{
	<IF> Cond() { jjtn000.line_num1 = jj_consume_token(THEN).beginLine; } (
		LOOKAHEAD(10) AssignStats()
		|	LOOKAHEAD(10) PutStat()
		|	<SM> ( Stat() )* #Block
				[ ( LOOKAHEAD(2) <ELSE> { jjtn000.line_num2 = jj_consume_token(SM).beginLine; } ( Stat() )* #Block | ElseIfStat() ) ]
				<ENDIF> { jjtn000.line_num3 = jj_consume_token(SM).beginLine; }
	)
}

void ElseIfStat() #IfStat :
{}
{
	<ELSEIF> <IF> Cond() { jjtn000.line_num1 = jj_consume_token(THEN).beginLine; } <SM> ( Stat() )* #Block
		[ ( LOOKAHEAD(2) <ELSE> { jjtn000.line_num2 = jj_consume_token(SM).beginLine; } ( Stat() )* #Block | ElseIfStat() ) ]
				
}

void WhileStat() :
{}
{
	Cond() <WHILE> { jjtn000.line_num1 = jj_consume_token(SM).beginLine; } ( Stat() )* #Block
	<ENDLOOP> { jjtn000.line_num2 = jj_consume_token(SM).beginLine; }
}

void RepeatUntil() :
{}
{
	<DOWHILE> { jjtn000.line_num1 = jj_consume_token(SM).beginLine; } ( Stat() )* #Block
	<DOWHILE2> Cond() <DOWHILE3> { jjtn000.line_num2 = jj_consume_token(SM).beginLine; }
}

void ForStat() :
{}
{
	Ident() <FOR> AddExpr() <FOR2> AddExpr() <FOR3> ForStatAdd() { jjtn000.line_num1 = jj_consume_token(SM).beginLine; }
	(Stat())* #Block <ENDLOOP> { jjtn000.line_num2 = jj_consume_token(SM).beginLine; }
}

void ForStatAdd() :
{}
{
	  [ AddExpr() <FOR4> ] ( <FORADD> {jjtThis.op = 1;} | <FORSUB> {jjtThis.op = -1;} )
}

void GetStat() :
{}
{
	  <GET> <LP> Ident() <RP> { jjtn000.line_num1 = jj_consume_token(SM).beginLine; }
}

void PutStat() :
{}
{
	 PutParam() ( <CM2> PutParam() )* ( <PUT> | <PUTLN> {jjtThis.n = "\n";} )
	 { jjtn000.line_num1 = jj_consume_token(SM).beginLine; }
}

void PutParam() #void :
{}
{
	AddExpr()
//	|	Strlit()
}

void Block() :
{}
{
	<LC> ( Stat() )* <RC>
}

void Cond() #void :
{}
{
	ORExpr()
}

void ORExpr() #void :
{}
{
	AndExpr() [ <OROP> Cond() #ORNode(2) ]
}

void AndExpr() #void :
{}
{
	NotExpr() [ <ANDOP> AndExpr() #ANDNode(2) ]
}

void NotExpr() #void :
{}
{
	EqualityExpr() [ <NOTOP> #NOTNode(1) ]
}

void EqualityExpr() #void :
{}
{
	RelationalExpr()
	[
		<EQOP> EqualityExpr() #EQNode(2)
		|	<NTOP> EqualityExpr() #NTNode(2)
	]
}

void RelationalExpr() #void :
{}
{
	AddExpr()
	[
		<LSOP> RelationalExpr() #LSNode(2)
		|	<GTOP> RelationalExpr() #GTNode(2)
		|	<LEOP> RelationalExpr() #LENode(2)
		|	<GEOP> RelationalExpr() #GENode(2)
	]
}

void AddExpr() #void :
{}
{
	MulExpr()
	(
		<ADDOP> MulExpr() #AddNode(2)
		|	<SUBOP> MulExpr() #SubNode(2)
	)*
}

void MulExpr() #void :
{}
{
	UnExpr()
	(
		<MULOP> UnExpr() #MulNode(2)
		|	<DIVOP> UnExpr() #DivNode(2)
		|	<SUROP> UnExpr() #SurNode(2)
	)*
}

void UnExpr() #void :
{}
{
	PrimExpr()
	|	<SUBOP> UnExpr() #MinNode(1)
}

void PrimExpr() #void :
{}
{
	Literal()
	|	FloatLiteral()
	|	Strlit()
	|	EOF_STR()
	|	FunctionExpr()
	|	Ident()
//	|	FunctionCall()
	|	<LP> Cond() <RP>
}

void FunctionExpr() #void :
{}
{
	Get()
	|	Random()
	|	Sine()
	|	Cosine()
	|	Tangent()
	|	Sqrt()
	|	Floor()
	|	Ceil()
	|	Round()
	|	Abs()
	|	Log()
	|	Int()
	|	Length()
	|	Substring()
	|	Insert()
	|	Replace()
	|	Extract()
	|	File_openr()
	|	File_openw()
	|	File_opena()
	|	File_getstr()
	|	File_getline()
	|	File_isfile()
}

void Get() :
{}
{
	<GET> <RP>
}

void Random() :
{}
{
	<RANDOM>AddExpr() <RP>
}

void Sine() :
{}
{
	<SIN>	AddExpr() <RP>
}

void Cosine() :
{}
{
	<COS>	AddExpr() <RP>
}

void Tangent() :
{}
{
	<TAN>	AddExpr() <RP>
}

void Sqrt() :
{}
{
	<SQRT>	AddExpr() <RP>
}

void Floor() :
{}
{
	<FLOOR>	AddExpr() <RP>
}

void Ceil() :
{}
{
	<CEIL>	AddExpr() <RP>
}

void Round() :
{}
{
	<ROUND>	AddExpr() <RP>
}

void Abs() :
{}
{
	<ABS>	AddExpr() <RP>
}

void Log() :
{}
{
	<LOG>	AddExpr() <RP>
}

void Int() :
{}
{
	<INT>	AddExpr() <RP>
}

void Length() :
{}
{
	<LENGTH>AddExpr() <RP>
}

void Substring() :
{}
{
	<SUBSTRING> AddExpr() <CM> AddExpr() [ <CM> AddExpr() ] <RP>
}

void Insert() :
{}
{
	<INSERT> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP>
}

void Replace() :
{}
{
	<REPLACE> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP>
}

void Extract() :
{}
{
	<EXTRACT> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP>
}

void gWindowOpen() :
{}
{
	<gWindowOpen> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gWindowClose() :
{}
{
	<gWindowClose> <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gColor() :
{}
{
	<gColor> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gDrawOval() :
{}
{
	<gDrawOval> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gDrawPoint() :
{}
{
	<gDrawPoint> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gFillOval() :
{}
{
	<gFillOval> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gFillPoint() :
{}
{
	<gFillPoint> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gDrawLine() :
{}
{
	<gDrawLine> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gDrawBox() :
{}
{
	<gDrawBox> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gFillBox() :
{}
{
	<gFillBox> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gDrawArc() :
{}
{
	<gDrawArc> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void gFillArc() :
{}
{
	<gFillArc> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void File_openr() :
{}
{
	<OPENR> AddExpr() <RP>
}

void File_openw() :
{}
{
	<OPENW> AddExpr() <RP>
}

void File_opena() :
{}
{
	<OPENA> AddExpr() <RP>
}

void File_close() :
{}
{
	<CLOSE> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void File_getstr() :
{}
{
	<GETSTR> AddExpr() <CM> AddExpr() <RP>
}

void File_getline() :
{}
{
	<GETLINE> AddExpr() <RP>
}

void File_putstr() :
{}
{
	<PUTSTR> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void File_putline() :
{}
{
	<PUTLINE> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void File_flush() :
{}
{
	<FLUSH> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void File_isfile() :
{}
{
	<ISFILE> AddExpr() <RP>
}

void File_rename() :
{}
{
	<RENAME> AddExpr() <CM> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void File_remove() :
{}
{
	<REMOVE> AddExpr() <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void Ident() :
{	Token t; }
{
	t=<IDENT> [
		<LD> ArrayNum() <RD>
		|	<LP> [  AddExpr() ( <CM> AddExpr() )* ] <RP> { jjtThis.flag = false; }
		]
		{
		//	if (symTable.containsKey(t.image)){
				jjtThis.varName = t.image;
				jjtThis.varName2= t.image;
		//	} else {
			/*
				new ConsoleAppend(
					"### �錾����Ă��Ȃ��ϐ�����"
					+ t.beginLine + "�s�ڂŎg�p����܂���\n"
				);
				throw new ParseException();
			*/
		//	}
		}
}

void ArrayNum() :
{}
{
	AddExpr() [ <CM> ArrayNum() ]
}

void FunctionCall() :
{	Token t; }
{
	t=<IDENT> <LP> [  AddExpr() ( <CM> AddExpr() )* ] <RP> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
		{
			jjtThis.varName = t.image;
			
		}
}

void Return() :
{}
{
	AddExpr() <RETURN> {jjtn000.line_num1 = jj_consume_token(SM).beginLine;}
}

void Literal() :
{	Token t; }
{
	t=<LITERAL>
		{
			try {
				jjtThis.litValue = Integer.parseInt(t.image);
			} catch (Exception e) {
				jjtThis.litValue = 0;
				new ConsoleAppend(
					"### " + t.beginLine + "�s�ڂ͖����Ȓl�ł� : "
					+ t.image + "\n"
				);
				throw new ParseException();
			}
		}
}

void FloatLiteral() :
{	Token t; }
{
	t=<FLOAT_LITERAL>
		{
			try {
				jjtThis.litValue = Double.parseDouble(t.image);
			} catch (Exception e) {
				jjtThis.litValue = 0;
				new ConsoleAppend(
					"### " + t.beginLine + "�s�ڂ͖����Ȓl�ł� : "
					+ t.image + "\n"
				);
				throw new ParseException();
			}
		}
}

void Strlit() :
{	Token t; }
{
	t=<STRLIT>
		{	jjtThis.litString = t.image; }
}

void EOF_STR() :
{}
{
	<EOF_STR>	{ jjtn000.char_code = -1; }
	| <NULL_STR>	{ jjtn000.char_code = -2; }
}