00001 package edu.ksu.cis.bandera.jjjc.unicodepreprocessor;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 import java.io.*;
00037
00038 import edu.ksu.cis.bandera.jjjc.unicodepreprocessor.lexer.*;
00039 import edu.ksu.cis.bandera.jjjc.unicodepreprocessor.node.*;
00040 import edu.ksu.cis.bandera.jjjc.unicodepreprocessor.analysis.*;
00041
00042 public class UnicodePreprocessor extends Reader {
00043 private UnicodeLexer lexer;
00044 private ProcessToken processor = new ProcessToken();
00045
00046 int available;
00047 char[] buffer = new char[2];
00048
00049 private class ProcessToken extends AnalysisAdapter {
00050 public void caseTEvenBackslash(TEvenBackslash node) {
00051 buffer[0] = '\\';
00052 buffer[1] = '\\';
00053 available = 2;
00054 }
00055
00056 public void caseTUnicodeEscape(TUnicodeEscape node) {
00057 String text = node.getText();
00058 buffer[0] = (char) Integer.parseInt(
00059 text.substring(text.length() - 4), 16);
00060 available = 1;
00061 }
00062
00063 public void caseTErroneousEscape(TErroneousEscape node) {
00064 throw new RuntimeException("Erroneous escape: " + node);
00065 }
00066
00067 public void caseTSub(TSub node) {
00068 buffer[0] = node.getText().charAt(0);
00069 available = 1;
00070 }
00071
00072 public void caseTRawInputCharacter(TRawInputCharacter node) {
00073 buffer[0] = node.getText().charAt(0);
00074 available = 1;
00075 }
00076
00077 public void caseEOF(EOF node) {
00078 available = 0;
00079 }
00080 }
00081
00082 public UnicodePreprocessor(PushbackReader in) {
00083 lexer = new UnicodeLexer(in);
00084 }
00085 public void close() {
00086 }
00087 public int read() throws IOException {
00088 if (available == 0) {
00089 try {
00090 lexer.next().apply(processor);
00091 } catch (LexerException e) {
00092 throw new RuntimeException(e.toString());
00093 }
00094 }
00095
00096 if (available == 0) {
00097 return -1;
00098 }
00099
00100 char c = buffer[0];
00101 buffer[0] = buffer[1];
00102 available--;
00103
00104 return c;
00105 }
00106 public int read(char cbuf[], int off, int len) throws IOException {
00107 for (int i = 0; i < len; i++) {
00108 int c = read();
00109
00110 if (c == -1) {
00111 if (i == 0) {
00112 return -1;
00113 } else {
00114 return i;
00115 }
00116 }
00117
00118 cbuf[off + i] = (char) c;
00119 }
00120
00121 return len;
00122 }
00123 }