Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 22nd, 2012  |  syntax: None  |  size: 4.38 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /*
  2.  * scanner.jflex -- SPL scanner specification
  3.  */
  4. package parse;
  5.  
  6. import java_cup.runtime.*;
  7.  
  8. %%
  9.  
  10. %class Scanner
  11. %public
  12. %line
  13. %column
  14. %unicode
  15.  
  16. %cup        
  17.  
  18. %{
  19.   private Symbol symbol(int type) {
  20.     return new Symbol(type, yyline + 1, yycolumn + 1);
  21.   }
  22.    
  23. private static Object hashen (String x)
  24.         {      
  25.                 Object rueck=x;        
  26.                 if ( x.startsWith("0x")) {     
  27.                         String tmp = x.substring(2);
  28.                         int n = Integer.parseInt(tmp, 16);
  29.                         rueck=n;
  30.                 }
  31.                 else if (x.charAt(0)=='\'')     {              
  32.                         if (x.length()==4)
  33.                         {
  34.                                 return 10;
  35.                         }
  36.                         String tmp=x.substring(1, x.length()-1);                       
  37.                         rueck=tmp.hashCode();
  38.                 }                      
  39.                 return rueck;
  40.         }
  41.  
  42.   private Symbol symbol(int type, Object value) {
  43.     return new Symbol(type, yyline + 1, yycolumn + 1, value);
  44.   }
  45.  
  46.   public void showToken(Symbol token) {
  47.     String s;
  48.     switch (token.sym) {
  49.         case sym.EOF:
  50.         s = "-- EOF --";
  51.         break;
  52.  
  53.         case sym.ARRAY:
  54.        s = "array";
  55.        break;  
  56.        
  57.        case sym.ELSE:
  58.        s = "else";
  59.        break;      
  60.        
  61.         case sym.IF:
  62.                 s = "if";
  63.                 break;
  64.                
  65.         case sym.OF:
  66.                 s = "of";
  67.                 break;
  68.                
  69.         case sym.PROC:
  70.        s = "proc";
  71.        break;
  72.  
  73.         case sym.REF:
  74.        s = "ref";
  75.        break;
  76.        
  77.         case sym.TYPE:
  78.       s = "type";      
  79.        break;
  80.        
  81.         case sym.VAR:
  82.        s = "var";
  83.        break;          
  84.      
  85.         case sym.WHILE:
  86.        s = "while";
  87.        break;    
  88.  
  89.         case sym.LPAREN:
  90.        s = "(";
  91.        break;
  92.  
  93.         case sym.RPAREN:
  94.        s = ")";
  95.        break;
  96.        
  97.         case sym.LBRACK:
  98.        s = "[";
  99.        break;    
  100.      
  101.         case sym.RBRACK:
  102.        s = "]";
  103.        break;    
  104.  
  105.         case sym.LCURL:
  106.        s = "{";
  107.        break;
  108.        
  109.         case sym.RCURL:
  110.        s = "}";
  111.        break;    
  112.        
  113.         case sym.EQ:
  114.        s = "=";
  115.        break;  
  116.  
  117.         case sym.NE:
  118.        s = "#";
  119.        break;    
  120.      
  121.         case sym.LT:
  122.        s = "<";
  123.        break;      
  124.        
  125.         case sym.LE:
  126.        s = "<=";
  127.        break;
  128.  
  129.         case sym.GT:
  130.        s = ">";
  131.        break;    
  132.      
  133.         case sym.GE:
  134.        s = ">=";
  135.        break;      
  136.        
  137.         case sym.ASGN:
  138.        s = ":=";
  139.        break;      
  140.        
  141.         case sym.COLON:
  142.        s = ":";
  143.        break;    
  144.      
  145.         case sym.COMMA:
  146.        s = ",";
  147.        break;      
  148.        
  149.         case sym.SEMIC:
  150.        s = ";";
  151.        break;
  152.        
  153.         case sym.PLUS:
  154.        s = "+";
  155.        break;      
  156.        
  157.         case sym.MINUS:
  158.        s = "-";
  159.        break;    
  160.      
  161.         case sym.STAR:
  162.        s = "*";
  163.        break;      
  164.        
  165.         case sym.SLASH:
  166.        s = "/";
  167.        break;    
  168.        
  169.         case sym.IDENT:
  170.        s = "Bezeichner: " + (String) token.value;
  171.        break;      
  172.        
  173.         case sym.INTLIT:
  174.        s = "Integer-Wert: " + token.value;
  175.        break;      
  176.  
  177.       default:
  178.         /* this should never happen */
  179.         throw new RuntimeException(
  180.           "unknown token " + token.sym + " in showToken"
  181.         );
  182.     }
  183.     System.out.println(
  184.       "TOKEN = " + s +
  185.       " in line " + token.left +
  186.       ", column " + token.right
  187.     );
  188.   }
  189.  
  190. %}
  191.  
  192.  
  193. %%
  194.  
  195. if {return symbol (sym.IF);}
  196. array {return symbol (sym.ARRAY);}
  197. else {return symbol (sym.ELSE);}
  198. of {return symbol (sym.OF);}
  199. proc {return symbol (sym.PROC);}
  200. ref {return symbol (sym.REF);}
  201. type {return symbol (sym.TYPE);}
  202. var {return symbol (sym.VAR);}
  203. while {return symbol (sym.WHILE);}
  204. \( {return symbol (sym.LPAREN);}
  205. \) {return symbol (sym.RPAREN);}
  206. \[ {return symbol (sym.LBRACK);}
  207. \] {return symbol (sym.RBRACK);}
  208. \{ {return symbol (sym.LCURL);}
  209. \} {return symbol (sym.RCURL);}
  210. \= {return symbol (sym.EQ);}
  211. \# {return symbol (sym.NE);}
  212. \< {return symbol (sym.LT);}
  213. \<\= {return symbol (sym.LE);}
  214. \> {return symbol (sym.GT);}
  215. \>\= {return symbol (sym.GE);}
  216. \:\= {return symbol (sym.ASGN);}
  217. \: {return symbol (sym.COLON);}
  218. \, {return symbol (sym.COMMA);}
  219. \; {return symbol (sym.SEMIC);}
  220. \+ {return symbol (sym.PLUS);}
  221. \- {return symbol (sym.MINUS);}
  222. \* {return symbol (sym.STAR);}
  223. \/ {return symbol (sym.SLASH);}
  224. "\t" {}
  225. \/\/.* {}
  226. [\n\r ] {}
  227.  
  228. [a-zA-Z_][a-zA-Z_0-9]* {return symbol (sym.IDENT, yytext());}
  229. [0-9]+|0x[0-9a-fA-F]+|\'.\'|\'\\n\' {return symbol (sym.INTLIT, hashen(yytext()));}
  230.  
  231.  
  232.  
  233. .               {
  234.                   throw new RuntimeException(
  235.                     "illegal character 0x" +
  236.                     Integer.toString((int) yytext().charAt(0), 16) +
  237.                     " in line " + (yyline + 1) +
  238.                     ", column " + (yycolumn + 1)
  239.                   );
  240.                 }