Newsgroup: it.comp.java
Titolo: Vector, String e InputStream

Salve a tutti.
Ho trovato un esempio che mi puo' essere utile ma che non riesco a
modificare correttamente.
Da tastiera vengono immessi, per es:
1+2;
1+2*5;
5*1+2;
5*(1+2);
Viene stampato di seguito il risultato dopo aver controllato la correttezza
lessicale e semantica dell'input.
Il cuore del codice originale, nella classe parser, e':
public static void main(String args[]) throws Exception {
  new parser(new Yylex(System.in)).parse();
 }
Vorrei che la stessa cosa fosse fatta utilizzando in input un Vector, quindi
ho modificato il listato:
public static void main() throws Exception {
 Vector inputs = new Vector();
 inputs.addElement("1+2;");
 inputs.addElement("1+2*5;");
 inputs.addElement("2*5+1;");
 InputStream in;
 in = new SequenceInputStream(inputs.elements());
 new parser(new Yylex(in)).parse();
 }
E, lanciando il programma, ho ottenuto:
Exception in thread "main" java.lang.NoSuchMethodError: main
Ho provato allora con:
public static void main(String args[]) throws Exception {
 Vector inputs = new Vector();
 inputs.addElement("1+2;");
 inputs.addElement("1+2*5;");
 inputs.addElement("2*5+1;");
 InputStream in;
 in = new SequenceInputStream(inputs.elements());
 new parser(new Yylex(in)).parse();
 }
Ed il risultato e' stato:
Exception in thread "main" java.lang.ClassCastException: java.lang.String
        at
java.io.SequenceInputStream.nextStream(SequenceInputStream.java:100)
        at java.io.SequenceInputStream.<init>(SequenceInputStream.java:59)
        at parser.main(parser.java:105)
.....
Il problema e' quindi "trasformare" il Vector in un InputStream.
Qualcuno puo' aiutarmi?
Grazie mille,
   Maggie

Ops, dimenticavo ... ho anche provato con:
public class prova {
public static void main() throws Exception {
 Vector inputs = new Vector();
 inputs.addElement("1+2;");
 inputs.addElement("1+2*5;");
 inputs.addElement("2*5+1;");
 parser proviamo = new parser();
 proviamo.main(inputs);
 }
}
public class parser {
public static void main(Vector inputs) throws Exception {
 InputStream in;
 in = new SequenceInputStream(inputs.elements());
 new parser(new Yylex(in)).parse();
 }
...
}
Se digito java prova ottengo:


  }
Gli elementi di inputs devono essere InputStream e non String.
Quindi, se non ti da' fastidio usare una classe deprecata,
il modo piu' rapido consiste nel modificare i vari addElement
in questo modo:
    inputs.addElement(new StringBufferInputStream("1+2*5;"));
    ecc...
--
Ciao. Leonardo 
bos...@uno.it
 
http://surf.to/tetractys

inputs.addElement(new StringBufferInputStream("1+2*5;"));
Non posso farlo, perche' in realta' inputs mi arriva gia' pronto da un altro
pezzo di programma: non posso modificare i vari .addElement :-(
Altre idee? :-)
Grazie mille comunque,
   Maggie

 Altre idee? :-)
Ci sono sicuramente alternative piu' efficienti :) , ma una
possibilita' per riutilizzare il codice gia' scritto
e' quella di costruire un nuovo vettore. Ad esempio:
/* dato "inputs" vettore di stringhe */
Vector stream = new Vector();
for(
  Enumeration e = inputs.elements();
  e.hasMoreElements();
) stream.addElement(
  new StringBufferInputStream(e.nextElement())
);
InputStream in;
in = new SequenceInputStream(stream.elements());
new parser(new Yylex(in)).parse();


Utilizzando:
stream.addElement(new StringBufferInputStream(e.nextElement()));
in compilazione ottenevo:
parser.java:120: Incompatible type for constructor. Explicit cast needed to
convert java.lang.Object to java.lang.String.
                stream.addElement(new
StringBufferInputStream(e.nextElement()));
Cosi' l'ho modificato in:
stream.addElement(new StringBufferInputStream((String)e.nextElement()));
e cosi' funziona, anche se utilizzando una classe deprecata.
L'altra alternativa che ho trovato e' "passare" attraverso un file ma questo
puo' creare problemi in caso di multithread "numeroso".
Grazie per l'idea ;-)
   Maggie

 Cosi' l'ho modificato in...
Scusa, ho scritto il codice senza provarlo. Non lo faro' piu' :)


>Scusa, ho scritto il codice senza provarlo.
Sei tu che devi scusare me, non era certamente una critica.
Era solo che mi sembrava giusto avvisarti, nel caso avessi voluto usare
quelle istruzioni in un tuo codice ;-)
Grazie ancora per aver avuto il tempo di aiutarmi
  Maggie