2016-12-16 1 views
0

J'ai un problème dans ce code, j'essaye de construire un scanner pour mon projet dans le cours du compilateur, le scanner prend toute entrée de l'utilisateur et le sépare en jetons .. la sortie sera: imprimer chaque jeton et son type (comme: numéro, identifiant, mot-clé, signe plus ... etc.) et enfin imprimer le nombre de jetons.Comment construire un scanner avec stringtokenizer

i ont essayé plusieurs entrées et chaque fois que la sortie est l'identifiant, et quand je l'ai essayé d'entrer un numéro ou un mot clé ou + ou - la sortie est identifiant ..

Voici mon code:

import java.util.Scanner; 
import java.util.StringTokenizer; 

public class MyScanner 
{ 
    public static void main(String[] args) 
    { 
     String reserved_Keywords[] = { "abstract", "assert", "boolean", 
       "break", "byte", "case", "catch", "char", "class", "const", 
       "continue", "default", "do", "double", "else", "extends", "false", 
       "final", "finally", "float", "for", "goto", "if", "implements", 
       "import", "instanceof", "int", "interface", "long", "native", 
       "new", "null", "package", "private", "protected", "public", 
       "return", "short", "static", "strictfp", "super", "switch", 
       "synchronized", "this", "throw", "throws", "transient", "true", 
       "try", "void", "volatile", "while" }; 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Enter Your Text: "); 
     String str = sc.nextLine(); 
     StringTokenizer st = new StringTokenizer(str); 
     int numofTokens = st.countTokens(); 
     while(st.hasMoreElements()) 
     { 
      for (int i = 0; i < reserved_Keywords.length; i++) 
      { 
       if (st.equals(reserved_Keywords[i])) 
       { 
        System.out.print(st.nextElement() + "\t"); 
        System.out.println("Is Reserved Keyword"); 
       } 
      } 

      if (st.equals("+")) 
      { 
       System.out.print(st.nextElement() + "\t"); 
       System.out.println("Is Plus Sign"); 
      } 

      else if (st.equals("-")) 
      { 
       System.out.print(st.nextElement() + "\t"); 
       System.out.println("Is Minus Sign"); 
      } 

      else if (st.equals("*")) 
      { 
       System.out.print(st.nextElement() + "\t"); 
       System.out.println("Is Multiply Sign"); 
      } 

      else if(st.equals("/")) 
      { 
       System.out.print(st.nextElement() + "\t"); 
       System.out.println("Is Divide Sign"); 
      } 

      else if (st.equals("=")) 
      { 
       System.out.print(st.nextElement() + "\t"); 
       System.out.println("Is Assignment Operator"); 
      } 

      else 
      { 
       System.out.print(st.nextElement() + "\t"); 
       System.out.println("Is Identifier"); 
      } 
     } 
     sc.close(); 
     System.out.println("Number of Tokens = " + numofTokens); 
    } 
} 
+0

L'entrée d'échantillon, la production attendue et la production réelle seraient utiles. –

Répondre

1

Vous comparez toujours (appel est égal à (..) (avec le StringTokenizer, non pas avec les jetons renvoyés par le StringTokenizer.

Pour soulever cela, ajoutez dans la première ligne de la boucle While

String TOKEN = st.nextToken(); 

puis de remplacer toutes les comparaisons (appels à égal()) avec st au lieu de TOKEN.

(Vous devez nommer la variable évidemment pas avec des lettres majuscules, je l'ai fait juste pour une meilleure lisibilité)

Ensuite, votre code ressemblera:

StringTokenizer st = new StringTokenizer(str); 
    int numofTokens = st.countTokens(); 
    while(st.hasMoreElements()) 
    { 
     String TOKEN = st.nextToken(); 
     for (int i = 0; i < reserved_Keywords.length; i++) 
     { 
      if (TOKEN.equals(reserved_Keywords[i])) 
      { 
       System.out.print(st.nextElement() + "\t"); 
       System.out.println("Is Reserved Keyword"); 
      } 
     } 

...

+0

Votre réponse est correcte, mais il n'y a aucune raison de mettre en majuscules le nom de la variable locale. Il devrait être simplement appelé 'token' – yole

+1

@yole Comme je l'ai dit dans ma réponse: C'était seulement pour le mettre en évidence dans ma réponse. Sinon le remplacement dans l'appel à égal pourrait être manqué facilement. –