Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package pal;
- public class LexAnal {
- String line = null;
- int index = 0;
- int marker = 0;
- String error = "";
- String name = "";
- String propval = "";
- static int EOF = -1;
- static final int R1 = 1, R2 = 2, R3 = 3, R4 = 4, R5 = 5, R6 = 6;
- LexAnal(String line) {
- line = line.replaceAll("\\(\\\\(?=\\d)", "\u0008");
- line = line.replaceAll("\\\\\\.", "\u0001");
- line = line.replaceAll("\\\\\\*", "\u0002");
- line = line.replaceAll("\\\\\\+", "\u0003");
- line = line.replaceAll("\\\\\\(", "\u0004");
- line = line.replaceAll("\\\\\\)", "\u0005");
- line = line.replaceAll("\\\\\\|", "\u0006");
- line = line.replaceAll("\\\\\\\\", "\u0007");
- this.line = line;
- }
- protected static boolean isdigit(char X) {
- return (X >= '0' && X <= '9');
- }
- protected static boolean isSpecialChar(char X) {
- return ((X == '.') || (X == '*') || (X == '+'));
- }
- protected static boolean isReducedASCII(char X) {
- return ((X >= 0x01 && X <= 0x0FF) && (X != '\u0008') && (X != '.') && (X != '*') && (X != '+') && (X != '(')
- && (X != ')') && (X != '|') && (X != '\\'));
- }
- // set marker and read next character
- private int getChar() {
- if (index >= line.length())
- return EOF;
- marker = index;
- return line.charAt(index++);
- }
- // set pointer one char back (to marked position)
- private void pushBackChar() {
- index = marker;
- }
- public void getToken() throws Exception {
- char[] tmp = new char[1];
- int myChar = 0;
- int state = R1;
- // String prop = "";
- name = "";
- propval = "";
- // read chars and create tokens
- try {
- do {
- // ///////////////////////////////////////////////////////////
- myChar = getChar();
- if (myChar == EOF && state != R1)
- return;
- else if (myChar == EOF) {
- name = "finished";
- return;
- }
- // throw new Exception("finished");
- switch (state) {
- case R1:
- if (myChar == '(') { // rule 2
- name = "oBracket";
- state = R1;
- return;
- }
- if (myChar == ')') { // rule 2
- name = "cBracket";
- state = R1;
- return;
- }
- if (myChar == 0x08) { // rule 4
- name = "brefNum";
- state = R2;
- pushBackChar();
- break;
- }
- if (isReducedASCII((char) myChar)) { // rule 5
- name = "redASCII";
- state = R3;
- pushBackChar();
- break;
- }
- if (isSpecialChar((char) myChar)) { // rule 6
- name = "specChar";
- tmp[0] = (char) myChar;
- propval = "" + new String(tmp);
- state = R1;
- return;
- }
- if (myChar == '|') {
- name = "or";
- state = R1;
- return;
- } else {
- throw new Exception("bad char");
- }
- case R2:
- if (isdigit((char) myChar)) {
- tmp[0] = (char) myChar;
- propval = propval + new String(tmp);
- break;
- } else if (myChar == ')') {
- state = R1;
- return;
- } else {
- new Exception("lexerror");
- }
- break;
- case R3:
- if (isReducedASCII((char) myChar)) {
- tmp[0] = (char) myChar;
- propval = propval + new String(tmp);
- break;
- } else {
- pushBackChar();
- state = R1;
- return;
- }
- }
- // ///////////////////////////////////////////////////////////
- } while (true);
- } catch (Exception e) {
- if (e.getMessage().equals("finished"))
- throw new Exception("finished");
- tmp[0]=(char)myChar;
- error = "Found \"" + new String(tmp) + "\" expected something else";
- System.out.println(error);
- throw new Exception("lexerror");
- }
- }
- public static void main(String[] args) {
- // LexAnal la = new LexAnal("\\. \\. \\| j\\\\ \\+ \\(");
- // LexAnal la = new LexAnal("((xdss|y)+)=(\\2)");
- LexAnal la = new LexAnal("***");
- // LexAnal la = new LexAnal("(((\\(1\\))))");
- try {
- while (true) {
- la.getToken();
- System.out.println(String.format("%s %s", la.name, la.propval));
- if(la.name.equals("finished")){
- break;
- }
- }
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
- }
- }
Add Comment
Please, Sign In to add comment