2016-12-17 1 views
-2

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

i ont déclaré deux fonctions, l'une pour déterminer si l'entrée est un mot-clé réservé java ou non, et le deuxième pour déterminer si l'entrée est un identificateur ou non ..

la première fonction qui détermine si l'entrée est un mot java réservé ou non fonctionne bien, mais j'ai un problème dans la déclaration de la deuxième fonction qui détermine si l'entrée est un identifiant ou non .. quand j'ai entré un mot clé réservé la sortie est: c'est un réservé mot et imprimer cette entrée est un identifiant plusieurs fois.

Voici mon code:

package My_Scanner; 
import java.util.Scanner; 
import java.util.StringTokenizer; 

public class MyScanner 
{ 

    private static void isOperator(String s) 
    { 
     if (s.equals("+")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Plus Sign"); 
     } 

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

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

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

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

     else if (s.equals("%")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is percent Operator"); 
     } 

     else if (s.equals(".")) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Full Stop"); 
     } 
    } 

    private static void isReservedWord(String s) 
    { 
     for (int i = 0; i < reserved_Keywords.length; i++) 
     { 
      if (s.equals(reserved_Keywords[i])) 
      { 
       System.out.print(s + "\t"); 
       System.out.println("Is Reserved Keyword"); 
      } 
     } 
    } 


    private static boolean isOpeningBracket(String s) 
    { 
     return ( s.equals("(") | s.equals("{") | s.equals("[") | s.equals("<") ); 
    } 

    private static boolean isClosingBracket(String s) 
    { 
     return ( s.equals(")") | s.equals("}") | s.equals("]") | s.equals(">") ); 
    } 

    private static void isIdentifier(String s) 
    { 
     boolean identifier = true; 
     if (!isOpeningBracket(s) && !isClosingBracket(s)) 
     { 
      for (int i = 0; i < reserved_Keywords.length; i++) { 
       if (s.equals(reserved_Keywords[i])) 
       { 
        identifier = false; 
        break; 
       } 
      } 
     } 

     if(identifier) 
     { 
      System.out.print(s + "\t"); 
      System.out.println("Is Identifier"); 
     } 
    } 

    static final 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", "main", "native", 
      "new", "null", "package", "private", "protected", "public", 
      "return", "short", "static", "strictfp", "string", "super", "switch", 
      "synchronized", "this", "throw", "throws", "transient", "true", 
      "try", "void", "volatile", "while" }; 

    public static void main(String[] args) 
    { 
     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.hasMoreTokens()) 
     { 
      String TOKEN = st.nextToken(); 

      isOperator(TOKEN); 
      isReservedWord(TOKEN); 
      isIdentifier(TOKEN); 
      if (isOpeningBracket(TOKEN)) 
      { 
       System.out.print(TOKEN + "\t"); 
       System.out.println("Is Left Bracket"); 
      } 
      else if (isClosingBracket(TOKEN)) 
      { 
       System.out.print(TOKEN + "\t"); 
       System.out.println("Is Right Bracket"); 
      } 
     } 
     sc.close(); 
     System.out.println("Number of Tokens = " + numofTokens); 
    } 
} 

Répondre

1

C'est parce que le else est mal placé. Il reprend tous les éléments et imprime la déclaration en else à chaque fois. Au lieu de cela, il a besoin d'imprimer qu'une seule fois après que la boucle est terminée, essayez le code ci-dessous:

private static void isIdentifier(String s) { 
    boolean identifier = true; 
    for (int i = 0; i < reserved_Keywords.length; i++) { 
     if (s.equals(reserved_Keywords[i])) { 
      identifier = false; 
      break; 
     } 
    } 

    if(identifier){ 
     System.out.print(s + "\t"); 
     System.out.println("Is Identifier"); 
    } 
} 

EDIT

Pour support de poignée d'ouverture et de fermeture, vous pouvez vérifier les avant d'appeler les méthodes de vérifier les identifiants et continue la boucle si vous trouvez un de ces caractères, par exemple:

while(st.hasMoreTokens()){ 
    String TOKEN = st.nextToken(); 
    if (isOpeningBracket(TOKEN)){ 
     System.out.print(TOKEN + "\t"); 
     System.out.println("Is Left Bracket"); 
     continue; 
    } 
    else if (isClosingBracket(TOKEN)){ 
     System.out.print(TOKEN + "\t"); 
     System.out.println("Is Right Bracket"); 
     continue; 
    } 
    isOperator(TOKEN); 
    isReservedWord(TOKEN); 
    isIdentifier(TOKEN); 
} 
+0

Merci, votre réponse fonctionne bien .. –

+0

mais lorsque je tente de vérifier cette entrée est entre parenthèses ou les opérateurs i ont la même problème –

+0

Merci, votre réponse fonctionne bien .. mais je ne comprends pas pourquoi vous avez utilisé 'continuer' –