PDA

View Full Version : [Java] StreamTokenizer impostarlo per...


luxorl
12-08-2008, 17:37
Ciao a tutti,
è possibile impostare uno StreamTokenizer in modo che riesca a separare i token riconoscendo come separatori le quattro operazioni più le tonde ( + - * / ) e in modo che restituisca anche queste come token?

Con uno StringTokenizer basta usare il costruttore:

StringTokenizer(String str, String delim, boolean returnDelims)


praticamente vorrei il risultato di questo costruttore:
StringTokenizer st=new StringTokenizer(in, "*-/+()", true);
però con lo StreamTokenizer. E' possibile?

Non uso lo StringTokenizer perché ho problemi poi a capire se il token è un numero o una Stringa, mentre con lo StreamTokenizer si può agevolmente distinguere il tipo di token tramite le costanti TT_WORD e TT_NUMBER

Potete aiutarmi?

Vincenzo1968
12-08-2008, 17:59
Ciao a tutti,
è possibile impostare uno StreamTokenizer in modo che riesca a separare i token riconoscendo come separatori le quattro operazioni più le tonde e in modo che restituisca anche queste come token?

Con uno StringTokenizer basta usare il costruttore:



praticamente vorrei il risultato di questo costruttore:
StringTokenizer st=new StringTokenizer(in, "*-/+()", true);
però con lo StreamTokenizer. E' possibile?

Non uso lo StringTokenizer perché ho problemi poi a capire se il token è un numero o una Stringa, mentre con lo StreamTokenizer si può agevolmente distinguere il tipo di token tramite le costanti TT_WORD e TT_NUMBER

Potete aiutarmi?

Ciao Luxorl,

nel mio sito (http://www.guidealgoritmi.it/ShowArticle.aspx?ID=2) puoi scaricare un analizzatore lessicale per espressioni aritmetiche.
É in linguaggio C ma puoi facilmente fare il porting su Java.
:)

luxorl
13-08-2008, 08:59
Ciao Luxorl,

nel mio sito (http://www.guidealgoritmi.it/ShowArticle.aspx?ID=2) puoi scaricare un analizzatore lessicale per espressioni aritmetiche.
É in linguaggio C ma puoi facilmente fare il porting su Java.
:)

Ti ringrazio ma vorrei affrontare il problema come detto sopra.
Nessuno sa se è possibile impostare lo StreamTokenizer in quel modo? :)

luxorl
13-08-2008, 16:41
Alla fine non riuscendo ad impostare lo StreamTokenizer ho usato lo StringTokenizer creando un trucchetto per riconoscere se il token è una costante (numero) o una variabile. Vi incollo il codice del metodo che riconosce i simboli. Ditemi cosa ne pensate e se secondo voi è o no una buona soluzione. Grazie ;)

public int prossimoSimbolo() {
if(!input.hasMoreTokens()){ //Fine Stringa
simbolo=END;
}else{
this.token=input.nextToken();
if(token.equals("+")){ simbolo=ADD; }
else if(token.equals("-")){ simbolo=MIN; }
else if(token.equals("*")){ simbolo=MUL; }
else if(token.equals("/")){ simbolo=DIV; }
else if(token.equals("(")){ simbolo=TONDA_APERTA; }
else if(token.equals(")")){ simbolo=TONDA_CHIUSA; }

/* Sfrutto il l'eccezione NumberFormatException per riconoscere
* se il token è una Stringa o un numero.
*/
else try{
Integer.parseInt(token); //se parseInt non solleva eccezione
simbolo=COSTANTE; // il token è un numero quindi simbolo = costante
}catch(NumberFormatException e){
try{
Integer.parseInt(""+token.charAt(0)); //se l'eccezione viene sollevata e il primo char del token è una Stringa
simbolo=TOKEN_INVALIDO; //allora Simbolo è sicuramente una variabile.
}catch(NumberFormatException e2){ //se invece il primo char è un numero ma non si è passato il primo controllo
simbolo=VARIABILE; //vuol dire che c'è un errore di sintassi del tipo token="1a" o token="12pd" ecc.
}
}

}//else

return simbolo;

}//prossimoSimbolo


NB: una variabile deve per forza iniziare con una lettera e può essere seguita da zero o più numeri/lettere. Una variabile non può iniziare con un numero.

Vincenzo1968
14-08-2008, 07:09
Distingue il meno unario da quello binario?

luxorl
14-08-2008, 09:08
Distingue il meno unario da quello binario?

La traccia del problema definisce la seguente grammatica:

<espressione>::=<termine>{<addop><termine>}
<termine>::=<fattore>{<mulop><fattore>}
<fattore>::=<costante>|<variabile>|(<espressione>)
<costante>::=<interosenzasegno>
<variabile>::=<identificatore>
<interosenzasegno>::=<cifra>{<cifra>}
<identificatore>::=<lettera>{<lettera>|<cifra>}
<cifra>::=0|…|9
<lettera>::=a|…|z|A|…|Z
<addop>::=+|-
<mulop>::=*|/

Le costanti sono definite come intero senza segno... penso di poter trascurare in questo caso il meno unario no?

Vincenzo1968
14-08-2008, 17:18
La traccia del problema definisce la seguente grammatica:

<espressione>::=<termine>{<addop><termine>}
<termine>::=<fattore>{<mulop><fattore>}
<fattore>::=<costante>|<variabile>|(<espressione>)
<costante>::=<interosenzasegno>
<variabile>::=<identificatore>
<interosenzasegno>::=<cifra>{<cifra>}
<identificatore>::=<lettera>{<lettera>|<cifra>}
<cifra>::=0|…|9
<lettera>::=a|…|z|A|…|Z
<addop>::=+|-
<mulop>::=*|/

Le costanti sono definite come intero senza segno... penso di poter trascurare in questo caso il meno unario no?

Si, data quella grammatica, puoi benissimo trascurare il meno unario.

Ciao

jcarcarazza
07-08-2012, 19:02
luxorl per caso ti ritrovi ancora questo progetto delle espressioni aritmetiche? Se è possibile vorrei vederlo perchè ne sto facendo uno simile e ci sono delle cose che vorrei chiarire.