//////////////////////////////////////////////////////////////////
//                      Elpas:LALR(1) Parser Generator Win32 1.00b
//									  eias erinys fecit, 2001. 02.
//												  eias@nexon.co.kr
//											  sheplany@nownuri.net
//////////////////////////////////////////////////////////////////

*.  Ͽ

	Elpas   ƴ 쿡 Ӱ Ͻ  ֽ
	. , ÿ  zip  ·  ֽñ  ٶ
	ϴ. ǹ  ø   ּҷ  ֽø  
	  亯 帮 ϰڽϴ.

0. What it Elpas?

	 Է Ư  ϴ ˾ƺ ؼ м
	   ֽϴ.   Ǵ  ParserԴϴ.

	Parser Generator ־   о شϴ Ľ 
	 ϰ,  Է¿ ؼ  ϴ  غ
	     AST (Abstract Syntax Tree)  ȯϴ
	Ŭ ( Elpas) մϴ.

	Elpas  ϵ Ǿ ֽϴ.
	
		Elpas.exe			: Elpas  
		ElpasEval_cpp.def	: Elpas Ǵ ҽ ø
		Elpas_cpp.def		: 			(")
		Elpas_h.def			: Elpas Ǵ  ø

1. version information

	v0.1b (2001. 01. 30)
		- pre-release

	v0.9b (2001. 02. 03)
		- first release

	v0.93b (2001. 02. 07)
		- minor changes
			: µ ҽ  ؽƮ   ڹٲ
			  Ǵ 
			: ũƮ  ġ (, ) Ǵ 
			  (, ) 
			: /* ... */  ĿƮ  ϴ  
			: ͹̳      
			: CParsed ߻ϴ ޸  

	v0.94b (2001. 03. 06)
		- minor changes
			: Ÿ ɺ ҹ    

	v1.00b (2001. 04. 18)
		- major changes
			: Ľ ̺  
			: ESL 
			
	v1.01b (2001. 06. 22)
		- minor changes
			: Ľ    ߻   ޸  .
			:     ƾ .
			
		- Known problems
			:  Left Recursion ִ    .
			: δ LR(1) ļ .
			:  ̸ ͹̳ΰ ͹̳   
			  ͹̳ηθ ó.
			:     ̻ Ÿ  üũ .


2. Elpas 

	Elpas [grammar script file]

		[grammar script file]	: ļ     
                                  


4. r.e script grammar

	<script> -> <in def> <out def> <start> <pre-script def> <grm list>

	<in def> ->    <elexname def> <elexfilename def>
				|| <elexfilename def> <elexname def>

	<out def> ->    <elpasname def> <elpasfilename def>
				|| <elpasfilename def> <elpasname def>

	<elexname def> -> elexname = [Էµ elex Ŭ ̸];
	<elexfilename def> -> elexfilename = "[Էµ elex  ̸]";

	<elpasname def> -> elpasname = [Էµ elpas Ŭ ̸];
	<elpasfilename def> -> elpasfilename = "[Էµ elpas  ̸]";

	<pre-script def> -> <pre-include def> <pre-define def> <error def>

	<pre-include def> -> include = <block>; || null
	<pre-define  def> -> define  = <block>; || null
	<error       def> -> error   = <block>; || null

	<start> -> <͹̳>;

	<block> -> {*[ũƮ]*}
	<_block> -> <block> || <block> <block> || null

	<grm list> -> <grm> <grm list> || null

	<grm> -> [<͹̳>] <sym list> <_block>;

	<sym list> -> <sym list> || [͹̳] <sym list> || [<͹̳>] <sym list>

	e.g) test.grm

		elexname = CTestElex;
		elexfilename = "TestElex";

		elpasname = CTestElpas;
		elpasfilename = ".\Test\TestElpas";

		include = {*
		#include <stdio.h>
		*};

		define = {*
		static int g_nOk = 10;
		*};

		error = {*
			printf("Error (%d, %d) : %s (%s) is not expected here.\n", _iRow, _iCol, _strType, _strText);
		*};

		<X>;

		<X> -><Y>
		{*
			printf("<Y> (%d, %d)\n", COL(0), ROW(0));
		*};
		<X>-> LPAREN {*
			printf("( (%d, %d)\n", COL(0), ROW(0));
		*}
		{*
			int a = 1;
		*};
		<Y>-> LPAREN <Y> RPAREN {*
			printf("%s (%d, %d), %s (%d, %d)\n", 
				SYM(0), COL(0), ROW(0), SYM(2), COL(2), ROW(2));
		*}
		|| INTEGER
		{*
			printf("%s (%d, %d) = %d\n",
				SYM(0), COL(0), ROW(0), (int) VAL(0));
		*};


4.  Elpas 

	 Elpas Ͽ [class name], [class name]FromElex   
	 Ŭ ֽϴ.  [class name] Ŭ   
	ϴ   ڽϴ.

		run)

		some drive:\some directory>Elpas test.grm

		D:\Data\Developments\PreDev\Elen>elpas .\script\test.grm
		Elpas:LALR(1) Parser Generator Win32 0.9b, 2001. 02. 03, eias erinys fecit.

		Loading Script...OK

				Elex  classname will be CTestElex
				Elex   filename will be TestElex (TestElex)
				Elpas classname will be CTestElpas
				Elpas  filename will be TestElpas (.\Test\TestElpas)

				Pre-script defined. (header inclusion)
				Pre-script defined. (definition)
				Pre-script defined. (error recover)

				Non-Terminals =
					<X> <Y>

				Terminals =
					INTEGER RPAREN LPAREN

				Starting Non-Terminal = <X>

				Dump Rules :
					<X> -> <Y> [s]
					<X> -> LPAREN [bs]
					<Y> -> LPAREN <Y> RPAREN [s]
					<Y> -> INTEGER [s]


		Dump Elpas files :
			.\Test\TestElpas.h
			.\Test\TestElpas.cpp
			.\Test\TestElpasEval.cpp


		some drive:\some directory>

	̷  CTestElpasFromElex ؼ

		code)

		CTestElexFromString elex("(((123)))");
		CTestElpasFromElex elpas(&elex);
		CTestElpasFromElex::CParsed* parsed;

		if (parsed = elpas.Parse()) {
			parsed->Evaluate();
			delete parsed;
		}

	  ڵ带 Ű,

		123 (1, 4) = 123
		( (1, 3), ) (1, 7)
		( (1, 2), ) (1, 8)
		( (1, 1), ) (1, 9)
		<Y> (1, 1)

	   ˴ϴ. 

