Files
dhbw-compilerbau/ÜB-Praxis-JFlex Scanner für AS-Leer/bin/de/dhbw/compiler/jflexasscanner/JFlexASScanner.flex

76 lines
2.5 KiB
Plaintext

/* **********************************************
* Duale Hochschule Baden-Württemberg Karlsruhe
* Prof. Dr. Jörn Eisenbiegler
*
* Vorlesung Übersetzerbau
* Praxis AS-Scanner mit JFlex 4
*
* **********************************************
*/
package de.dhbw.compiler.jflexasscanner;
%%
%class JFlexASScanner
%function nextToken
%type Token
%unicode
%line
%column
%public
%final
%xstate FRAC, EXP, STR, NULL, ID, NUM
%{
String idValue = "";
int intValue = 0;
%}
WhiteSpace = [ \t\b\r\n]+
SmallChars = [a-z]
CapitalChars = [A-Z]
Numbers = [0-9]
AllChars = [a-zA-Z0-9]
%eofval{
return new Token(Token.EOF, "", yyline+1, yycolumn+1);
%eofval}
%%
//[^] { return new Token(Token.INVALID, yytext(), yyline+1, yycolumn+1); }
{WhiteSpace} { /* Ignore */ }
<YYINITIAL> {
"null" { return new Token(Token.NULL, yytext(), yyline+1, yycolumn+1); }
{AllChars} { yybegin(ID);
idValue = yytext(); System.out.println("BEGIN ID <"+idValue+">"); }
{Numbers} { yybegin(NUM);
intValue = yycharat(0)-'0'; }
[\[] { return new Token(Token.LSBR, yytext(), yyline+1, yycolumn+1); }
[\]] { return new Token(Token.RSBR, yytext(), yyline+1, yycolumn+1); }
[,] { return new Token(Token.COMMA, yytext(), yyline+1, yycolumn+1); }
}
<NUM> {
{Numbers} { intValue = intValue * 10 + yycharat(0) - '0'; }
{SmallChars} | {CapitalChars} { yybegin(ID); idValue = String.valueOf(intValue); yypushback(1); }
[^] { yybegin(YYINITIAL);
yypushback(1);
return new NumToken(String.valueOf(intValue), yyline+1, yycolumn+1); }
<ID> {
{AllChars} { idValue += yytext(); }
}
<ID> [^] { yybegin(YYINITIAL);System.out.println("PUSHBACK BEFORE <"+yytext()+">");
yypushback(1); System.out.println("PUSHBACK AFTER <"+yytext()+">"); System.out.println("LINE <"+yyline+"> / COLUMN <"+yycolumn+">");
return new Token(Token.ID, idValue, yyline+1, yycolumn); }
[^] { return new Token(Token.INVALID, yytext(), yyline+1, yycolumn+1);
/*throw new Error("Illegal character <" + yytext() + ">"); */}