Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Problema stream tokenizer

    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;
    	}
    }
    Maria

  2. #2
    Ho riscontrato anche un altro problema.. Infatti utilizzando i numeri non riesco ad avere l'operatore in quanto visto come segno del numero.. Come posso fare?! Off topic: sono nuova del forum e non sono riuscita a mettere postare il codice così come si dovrebbe.. Potreste dirmi come si fa?! Grazie
    Maria

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013

    Re: Problema stream tokenizer

    Si legge il regolamento e si scopre dell'esistenza del tag "code"

    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;
    	}
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Grazie mille andrea.. Avevo provato con il tag code però non me lo formattava come richiesto.. Grazie mille per questo.. per il resto nessuno sa darmi una mano?
    Maria

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    prego. Non ho mai usato StreamTokenizer però vedo che usi correttamente il resetSyntax e quindi il carattere di default "blank" per creare i Token dovrebbe essere ignorato. Non ho letto tutto il codice, ma non è che da qualche parte usi un next di troppo, quindi ad ogni iterazione skippa 2 token, e quindi introducendo l'extra blank si rimetta a posto?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    non lo so.. io ad ogni giro chiamo un next token e quindi dovrebbe chiamare un carattere alla volta.. Secondo me nel costruttore dovrei inserire qualche abilitazione però non so proprio come fare!!
    Maria

  7. #7
    ciao anche io ho fatto cosi la classe analizzatore lessicale.
    Ti volevo chiedere come hai fatto la classe builder?
    Io ho pensato di fare una classe rdpb ma ho qualche dubbio di quando vanno usate le parentesi.

  8. #8
    Ragazzi nessuno riesce ad aiutarmi con stream tokenizer?!?! Sono davvero in palla..
    Maria

  9. #9
    per juventino doc.. Devi utilizzare rdpb e ogni vota che il token è una parentesi aperta richiami il metodo all'inizio della gerarchia (per me è espressione) se è parentesi chiusa invece non fai niente..
    Maria

  10. #10
    potresti postare o se preferisci,me la mandi in privato,la classe rdpb.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.