Salve ragazzi,
ho un problema con l'utilizzo di stream tokenizer. In pratica ho creato un progettino che data in ingresso una espressione condizionale sotto forma di stringa mi costruisce l'albero sintattico. Per poter creare l'albero sintattico mi sono appoggiata su una classe analizzatore lessicale che che mi ritorna il prossimo simbolo in modo da poter creare l'albero. Con tale classe ho un problema, ovvero per far si che mi riconosca la stringa devo inserire uno spazio tra ogni simbolo ovvero: ( 8 - 9 ) > 3
se inserisco (8-9)>3 non mi da nessun risultato. E' evidente che sbaglio ad impostare qualcosa nello stream tokenizer però non riesco a capire cosa!! I simboli che vedete in maiuscolo sono di una classe enum e rappresentano simboli che sono ammessi: vi posto il codice:
codice:public class AnalizzatoreLessicale { private Simboli simb; private StreamTokenizer input; private int num; private String variabile; public AnalizzatoreLessicale(Reader r2) { Reader r = new BufferedReader(r2); input = new StreamTokenizer(r); input.resetSyntax(); input.eolIsSignificant(true); input.wordChars('a', 'z'); input.wordChars('A', 'Z'); input.wordChars('*', '/'); input.wordChars('<', '>'); input.wordChars('!', '!'); input.wordChars('(', ')'); input.wordChars('[', ']'); input.wordChars('|', '|'); input.wordChars('&', '&'); input.wordChars('0', '9'); input.wordChars('%', '%'); input.wordChars('^', '^'); input.whitespaceChars('\0', ' '); // input.ordinaryChar('('); // input.ordinaryChar(')'); // input.ordinaryChar('['); // input.ordinaryChar(']'); input.parseNumbers(); } public Simboli simboloSuccessivo() { try { switch (input.nextToken()) { case StreamTokenizer.TT_EOL: { simb = Simboli.EOF; break; } case StreamTokenizer.TT_WORD: { if (input.sval.equalsIgnoreCase("or") || input.sval.equalsIgnoreCase("||")) { simb = Simboli.OR; break; } else if (input.sval.equalsIgnoreCase("and") || input.sval.equals("&&")) { simb = Simboli.AND; break; } else if (input.sval.equals(">")) { simb = Simboli.GT; break; } else if (input.sval.equalsIgnoreCase(">=")) { simb = Simboli.GE; break; } else if (input.sval.equalsIgnoreCase("<")) { simb = Simboli.LT; break; } else if (input.sval.equalsIgnoreCase("<=")) { simb = Simboli.LE; break; } else if (input.sval.equalsIgnoreCase("==")) { simb = Simboli.EQ; break; } else if (input.sval.equalsIgnoreCase("!=")) { simb = Simboli.NEQ; break; } else if (input.sval.equalsIgnoreCase("+")) { simb = Simboli.PLUS; break; } else if (input.sval.equalsIgnoreCase("-")) { simb = Simboli.MINUS; break; } else if (input.sval.equalsIgnoreCase("*")) { simb = Simboli.MULT; break; } else if (input.sval.equalsIgnoreCase("/")) { simb = Simboli.DIV; break; } else if (input.sval.equalsIgnoreCase("^")) { simb = Simboli.POWER; break; } else if (input.sval.equals("(")) { simb = Simboli.OPAR; break; } else if (input.sval.equalsIgnoreCase("%")) { simb = Simboli.REM; break; } else if (input.sval.equals("[")) { simb = Simboli.OPAR1; break; } else { simb = Simboli.ID; variabile = input.sval; break; } } case StreamTokenizer.TT_NUMBER: { simb = Simboli.NUM; num = (int) input.nval; break; } }// switch } catch (IOException e) { simb = Simboli.EOF; } return simb; } public int getNum() { return num; } public String getVariabile() { return variabile; } }

Rispondi quotando
