2013-06-09 4 views
0

J'écris un analyseur, et je travaille actuellement sur différents jetons correspondant, et je vais avoir un peu de mal avec correspondance. J'ai un fichier de test:analyseur Java et regex

while a != b 
    if a > b 
    a := a - b 
    if a <= b 
    b := b - a 
elihw 

Et une partie de mon code:

private static Scanner sc = new Scanner(System.in); 
private static Pattern tokenPattern = Pattern.compile("[ ]+"); 
private static Pattern idPattern = Pattern.compile("[a-zA-Z]+"); 

....main(...) { 
     sc.useDelimiter(tokenPattern); 
     statement(); 
    } 

public static void statement() { 
    System.out.println("Statement"); 
    String token = null; 
    while (sc.hasNext()) { 
     if (sc.hasNext(idPattern)) { 
      token = sc.next(); 
      System.out.print(" (" + token + ") "); 
     } 
     else { 
      token = sc.next(); 
      System.out.print(token + ' '); 
     } 
    } 
} 

Quand je lance cette méthode, il correspond à des chaînes avant les opérateurs, mais pas les uns après. Les parenths sont là juste pour marquer ceux qui correspondent. Par exemple, la ligne

a := a - b 

produira sortie:

(a) := (a) - b 

Je ne peux pas comprendre pourquoi le b ne correspond pas.

Aussi si quelqu'un pouvait m'aider avec une regex qui correspond aux opérateurs ce serait génial. J'ai essayé beaucoup de variations de choses comme ceci:

[\+\-\*\\] 
[\\+\\-\\*\\\] 
[+][-][*][/] 

Mais ne peux pas sembler avoir raison.

+1

Vous faites ce mal. Vous devez écrire un scanner approprié, pas seulement une collection de regex. Jetez un oeil à JFlex. – EJP

+0

Cela irait à l'encontre de l'objectif de cet exercice. – user2467567

+0

ajouté Déclaration du scanner – user2467567

Répondre

0

Le scanner inclut probablement un caractère non-imprimable (nouvelle ligne) dans le jeton.

Essayez ceci:

private static Pattern tokenPattern = Pattern.compile("[ \r\n\t]+"); 

Pour les opérateurs, essayez ceci:

[<>+-/*=:]+ 
+0

Cloué! Merci beaucoup. – user2467567