- /*
- * scanner.jflex -- SPL scanner specification
- */
- package parse;
- import java_cup.runtime.*;
- %%
- %class Scanner
- %public
- %line
- %column
- %unicode
- %cup
- %{
- private Symbol symbol(int type) {
- return new Symbol(type, yyline + 1, yycolumn + 1);
- }
- private static Object hashen (String x)
- {
- Object rueck=x;
- if ( x.startsWith("0x")) {
- String tmp = x.substring(2);
- int n = Integer.parseInt(tmp, 16);
- rueck=n;
- }
- else if (x.charAt(0)=='\'') {
- if (x.length()==4)
- {
- return 10;
- }
- String tmp=x.substring(1, x.length()-1);
- rueck=tmp.hashCode();
- }
- return rueck;
- }
- private Symbol symbol(int type, Object value) {
- return new Symbol(type, yyline + 1, yycolumn + 1, value);
- }
- public void showToken(Symbol token) {
- String s;
- switch (token.sym) {
- case sym.EOF:
- s = "-- EOF --";
- break;
- case sym.ARRAY:
- s = "array";
- break;
- case sym.ELSE:
- s = "else";
- break;
- case sym.IF:
- s = "if";
- break;
- case sym.OF:
- s = "of";
- break;
- case sym.PROC:
- s = "proc";
- break;
- case sym.REF:
- s = "ref";
- break;
- case sym.TYPE:
- s = "type";
- break;
- case sym.VAR:
- s = "var";
- break;
- case sym.WHILE:
- s = "while";
- break;
- case sym.LPAREN:
- s = "(";
- break;
- case sym.RPAREN:
- s = ")";
- break;
- case sym.LBRACK:
- s = "[";
- break;
- case sym.RBRACK:
- s = "]";
- break;
- case sym.LCURL:
- s = "{";
- break;
- case sym.RCURL:
- s = "}";
- break;
- case sym.EQ:
- s = "=";
- break;
- case sym.NE:
- s = "#";
- break;
- case sym.LT:
- s = "<";
- break;
- case sym.LE:
- s = "<=";
- break;
- case sym.GT:
- s = ">";
- break;
- case sym.GE:
- s = ">=";
- break;
- case sym.ASGN:
- s = ":=";
- break;
- case sym.COLON:
- s = ":";
- break;
- case sym.COMMA:
- s = ",";
- break;
- case sym.SEMIC:
- s = ";";
- break;
- case sym.PLUS:
- s = "+";
- break;
- case sym.MINUS:
- s = "-";
- break;
- case sym.STAR:
- s = "*";
- break;
- case sym.SLASH:
- s = "/";
- break;
- case sym.IDENT:
- s = "Bezeichner: " + (String) token.value;
- break;
- case sym.INTLIT:
- s = "Integer-Wert: " + token.value;
- break;
- default:
- /* this should never happen */
- throw new RuntimeException(
- "unknown token " + token.sym + " in showToken"
- );
- }
- System.out.println(
- "TOKEN = " + s +
- " in line " + token.left +
- ", column " + token.right
- );
- }
- %}
- %%
- if {return symbol (sym.IF);}
- array {return symbol (sym.ARRAY);}
- else {return symbol (sym.ELSE);}
- of {return symbol (sym.OF);}
- proc {return symbol (sym.PROC);}
- ref {return symbol (sym.REF);}
- type {return symbol (sym.TYPE);}
- var {return symbol (sym.VAR);}
- while {return symbol (sym.WHILE);}
- \( {return symbol (sym.LPAREN);}
- \) {return symbol (sym.RPAREN);}
- \[ {return symbol (sym.LBRACK);}
- \] {return symbol (sym.RBRACK);}
- \{ {return symbol (sym.LCURL);}
- \} {return symbol (sym.RCURL);}
- \= {return symbol (sym.EQ);}
- \# {return symbol (sym.NE);}
- \< {return symbol (sym.LT);}
- \<\= {return symbol (sym.LE);}
- \> {return symbol (sym.GT);}
- \>\= {return symbol (sym.GE);}
- \:\= {return symbol (sym.ASGN);}
- \: {return symbol (sym.COLON);}
- \, {return symbol (sym.COMMA);}
- \; {return symbol (sym.SEMIC);}
- \+ {return symbol (sym.PLUS);}
- \- {return symbol (sym.MINUS);}
- \* {return symbol (sym.STAR);}
- \/ {return symbol (sym.SLASH);}
- "\t" {}
- \/\/.* {}
- [\n\r ] {}
- [a-zA-Z_][a-zA-Z_0-9]* {return symbol (sym.IDENT, yytext());}
- [0-9]+|0x[0-9a-fA-F]+|\'.\'|\'\\n\' {return symbol (sym.INTLIT, hashen(yytext()));}
- . {
- throw new RuntimeException(
- "illegal character 0x" +
- Integer.toString((int) yytext().charAt(0), 16) +
- " in line " + (yyline + 1) +
- ", column " + (yycolumn + 1)
- );
- }