|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | ||
|
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
[Java] StreamTokenizer impostarlo per...
Ciao a tutti,
è possibile impostare uno StreamTokenizer in modo che riesca a separare i token riconoscendo come separatori le quattro operazioni più le tonde Quote:
Con uno StringTokenizer basta usare il costruttore: Quote:
Codice:
StringTokenizer st=new StringTokenizer(in, "*-/+()", true); 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?
__________________
Ultima modifica di luxorl : 12-08-2008 alle 18:40. |
||
|
|
|
|
|
#2 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
nel mio sito puoi scaricare un analizzatore lessicale per espressioni aritmetiche. É in linguaggio C ma puoi facilmente fare il porting su Java. |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Quote:
Nessuno sa se è possibile impostare lo StreamTokenizer in quel modo?
__________________
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
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
Codice:
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.
__________________
Ultima modifica di luxorl : 13-08-2008 alle 17:45. |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Distingue il meno unario da quello binario?
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
La traccia del problema definisce la seguente grammatica:
Codice:
<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>::=*|/
__________________
|
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Ciao |
|
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Aug 2012
Messaggi: 3
|
richiesta
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.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:18.



















