import java_cup.runtime.*;

%%


%implements java_cup.runtime.Scanner
%function next_token
%type java_cup.runtime.Symbol



%eofval{
	return (new Symbol(sym.EOF));
%eofval}


%{
	private int column = 0;
%}

%char
%line
%ignorecase




alpha=[a-zA-Z]
digit=[0-9]
alphanum=({alpha}|[0-9])
underscore="_"

spaces=[ \t\b]
enter=\r\n

id={alpha}({alphanum}|{underscore})*

number={digit}({digit})*

/*Palabras clave del lenguaje MicroAda*/

package="package"
is="is"
begin="begin"
end="end"
array="array"
of="of"
integer="integer"
character="character"
boolean="boolean"
procedure="procedure"
in="in"
out="out"
if="if"
then="then"
else="else"
elseif="elseif"
loop="loop"
exit="exit"
when="when"
return="return"
null="null"
read="read"
readln="readln"
write="write"
writeln="writeln"
while="while"
for="for"
reverse="reverse"
val="val"
char="char"
first="first"
last="last"
and="and"
or="or"
not="not"
abs="abs"
true="true"
false="false"
mod="mod"
nchar = '.'


/*Simbolos y operadores del lenguaje MicroAda*/

comment="--"
semi=";"
comma=","
vpoints=":"
lpar="("
rpar=")"
assign=":="
hpoints=".."
ap="'"
lt="<"
gt=">"
le="<="
ge=">="
eq="="
neq="/="
plus="+"
minus="-"
times="*"
div="/"
any=.
com=\"
anylesscom=[^\"\r]

%state COMMENT

%%



<YYINITIAL>{number}	{
					System.out.println("<NUMBER,"+yytext()+">");
					return (new Symbol(sym.NUMBER,new Integer(yytext())));
					}
<YYINITIAL>{package}	{
						System.out.println(yytext());
						return (new Symbol(sym.PACKAGE));}
<YYINITIAL>{is}		{
					System.out.println(yytext());
					return (new Symbol(sym.IS));
					}
<YYINITIAL>{begin}	{
					System.out.println(yytext());
					return (new Symbol(sym.BEGIN));
					}
<YYINITIAL>{end}	{
					System.out.println(yytext());
					return (new Symbol(sym.END));
					}
<YYINITIAL>{array}	{
					System.out.println(yytext());
					return (new Symbol(sym.ARRAY));
					}
<YYINITIAL>{of}		{
					System.out.println(yytext());
					return (new Symbol(sym.OF));
					}
<YYINITIAL>{integer}	{
						System.out.println(yytext());
						return (new Symbol(sym.INTEGER));
						}
<YYINITIAL>{character}	{System.out.println(yytext());return (new Symbol(sym.CHARACTER));}
<YYINITIAL>{boolean}	{System.out.println(yytext());return (new Symbol(sym.BOOLEAN));}
<YYINITIAL>{procedure}	{System.out.println(yytext());return (new Symbol(sym.PROCEDURE));}
<YYINITIAL>{in}		{System.out.println(yytext());return (new Symbol(sym.IN));}
<YYINITIAL>{out}	{System.out.println(yytext());return (new Symbol(sym.OUT));}
<YYINITIAL>{if}		{System.out.println(yytext());return (new Symbol(sym.IF));}
<YYINITIAL>{then}	{System.out.println(yytext());return (new Symbol(sym.THEN));}
<YYINITIAL>{elseif}	{System.out.println(yytext());return (new Symbol(sym.ELSEIF));}
<YYINITIAL>{else}	{System.out.println(yytext());return (new Symbol(sym.ELSE));}
<YYINITIAL>{loop}	{System.out.println(yytext());return (new Symbol(sym.LOOP));}
<YYINITIAL>{exit}	{System.out.println(yytext());return (new Symbol(sym.EXIT));}
<YYINITIAL>{when}	{System.out.println(yytext());return (new Symbol(sym.WHEN));}
<YYINITIAL>{return}	{System.out.println(yytext());return (new Symbol(sym.RETURN));}
<YYINITIAL>{null}	{System.out.println(yytext());return (new Symbol(sym.NULL));}
<YYINITIAL>{read}	{System.out.println(yytext());return (new Symbol(sym.READ));}
<YYINITIAL>{readln}	{System.out.println(yytext());return (new Symbol(sym.READLN));}
<YYINITIAL>{write}	{System.out.println(yytext());return (new Symbol(sym.WRITE));}
<YYINITIAL>{writeln}	{System.out.println(yytext());return (new Symbol(sym.WRITELN));}
<YYINITIAL>{while}	{System.out.println(yytext());return (new Symbol(sym.WHILE));}
<YYINITIAL>{for}	{System.out.println(yytext());return (new Symbol(sym.FOR));}
<YYINITIAL>{reverse}	{System.out.println(yytext());return (new Symbol(sym.REVERSE));}
<YYINITIAL>{val}	{System.out.println(yytext());return (new Symbol(sym.VAL));}
<YYINITIAL>{char}	{System.out.println(yytext());return (new Symbol(sym.CHAR));}
<YYINITIAL>{first}	{System.out.println(yytext());return (new Symbol(sym.FIRST));}
<YYINITIAL>{last}	{System.out.println(yytext());return (new Symbol(sym.LAST));}
<YYINITIAL>{and}	{System.out.println(yytext());return (new Symbol(sym.AND));}
<YYINITIAL>{or}		{System.out.println(yytext());return (new Symbol(sym.OR));}
<YYINITIAL>{not}	{System.out.println(yytext());return (new Symbol(sym.NOT));}
<YYINITIAL>{abs}	{System.out.println(yytext());return (new Symbol(sym.ABS));}
<YYINITIAL>{true}	{System.out.println(yytext());return (new Symbol(sym.TRUE));}
<YYINITIAL>{false}	{System.out.println(yytext());return (new Symbol(sym.FALSE));}
<YYINITIAL>{mod}	{System.out.println(yytext());return (new Symbol(sym.MOD));}
<YYINITIAL>{semi}	{System.out.println(yytext());return (new Symbol(sym.SEMI));}
<YYINITIAL>{comma}	{return (new Symbol(sym.COMMA));}
<YYINITIAL>{vpoints}	{System.out.println(yytext());return (new Symbol(sym.VPOINTS));}
<YYINITIAL>{lpar}	{System.out.println(yytext());return (new Symbol(sym.LPAR));}
<YYINITIAL>{rpar}	{System.out.println(yytext());return (new Symbol(sym.RPAR));}
<YYINITIAL>{assign}	{System.out.println(yytext());return (new Symbol(sym.ASSIGN));}
<YYINITIAL>{hpoints}	{System.out.println(yytext());return (new Symbol(sym.HPOINTS));}
<YYINITIAL>{ap}		{System.out.println(yytext());return (new Symbol(sym.AP));}
<YYINITIAL>{lt}		{System.out.println(yytext());return (new Symbol(sym.LT));}
<YYINITIAL>{gt}		{System.out.println(yytext());return (new Symbol(sym.GT));}
<YYINITIAL>{le}		{System.out.println(yytext());return (new Symbol(sym.LE));}
<YYINITIAL>{ge}		{System.out.println(yytext());return (new Symbol(sym.GE));}
<YYINITIAL>{eq}		{System.out.println(yytext());return (new Symbol(sym.EQ));}
<YYINITIAL>{neq}	{System.out.println(yytext());return (new Symbol(sym.NEQ));}
<YYINITIAL>{plus}	{System.out.println(yytext());return (new Symbol(sym.PLUS));}
<YYINITIAL>{minus}	{System.out.println(yytext());return (new Symbol(sym.MINUS));}
<YYINITIAL>{times}	{System.out.println(yytext());return (new Symbol(sym.TIMES));}
<YYINITIAL>{div}	{System.out.println(yytext());return (new Symbol(sym.DIV));}
<YYINITIAL>{id}		{
					if (yytext().length()>8) // Si el tamano del ID es mayor a 8
						{
						System.out.println("Error Lexico ID mayor a 8 caracteres: "+yytext());
						System.exit(1);
						}
					System.out.println("<ID,"+yytext()+">");
					return (new Symbol(sym.ID,yytext()));
					}
<YYINITIAL>{nchar}  {
					/*Retornar el caracter que detecto*/
					System.out.println("<NCHAR,"+yytext()+">");
					return (new Symbol(sym.NCHAR,yytext()));
					}
<YYINITIAL>{enter}	{column = yychar+2;}
<YYINITIAL>{comment}	{yybegin(COMMENT);}
<YYINITIAL>{spaces}	{}

<YYINITIAL>{any}	{
					/*Salirse si encuentra un caracter raro*/
					System.out.println("Error Lexico: "+yytext());
					System.exit(1);
					}


<COMMENT>{enter}	{yybegin(YYINITIAL);}
<COMMENT>{any}		{}

