2010-02-24 5 views
0

J'essaie d'analyser un certain nombre d'enregistrements de texte où les éléments d'un enregistrement sont séparés par un caractère '+', et où l'ensemble de l'enregistrement est terminé par un caractère '#'. Par exemple E1 + E2 + E3 + E4 + E5 + E6 #Analyseur ANTLR Question

Des éléments individuels peuvent être requis ou facultatifs. Si un élément est optionnel, sa valeur est simplement manquante. Par exemple, si E2 manquait, la chaîne d'entrée serait: E1 ++ E3 + E4 + E5 + E6 #.

Lorsque vous traitez des éléments traînants vides, le caractère séparateur ('+') peut également manquer. Si, par exemple, les 3 derniers éléments manquaient, la chaîne pourrait être: E1 + E2 + E3 #, mais cela pourrait aussi être: E1 + E2 + E3 +++ #

J'ai essayé la règle suivante dans Antlr:

'R1' 'E1 + E2 + E3' '+'? 'E4'? '+'? 'E5'? '+'? 'E6'? '#

mais Antlr se plaint que c'est ambigu ce qui bien sûr est correct (chaque jeton suivant E3 pourrait être E4, E5 ou E6). La syntaxe d'entrée est fixe (elle provient d'un système mainframe hérité), donc je me demandais si quelqu'un avait une solution à ce problème? Une alternative serait de spécifier toutes les permutations différentes dans la règle, mais ce serait une tâche majeure.

Meilleures salutations et merci,

Michael

+0

Pourriez-vous publier * toutes * vos règles lexer? (en supposant que ce ne soit pas beaucoup d'entre eux) –

Répondre

0

Si cela est ambigu, il est probable que votre E s ont tous le même format (un cas plus complexe serait que votre E est tout simplement commencer par le même k caractères où k est votre lookahead, mais je vais supposer que ce n'est pas le cas.Si c'est, cela fonctionnera encore, il faudra juste une étape supplémentaire.)

Donc, il semble que vous pouvez avoir jusqu'à 6 E sa nd jusqu'à 5 + s. Nous dirons qu'un "segment" est un E facultatif suivi d'un + - vous pouvez avoir 5 segments, et un suivi facultatif E.

Cette grammaire peut être représenté à peu près comme ceci (syntaxe imparfaite ANTLR puisque je ne suis pas très familier avec elle):

r : (e_opt? PLUS){1,5} e_opt? END 
e_opt : E // whatever your E is 
PLUS : '+' 
END : '#' 

Si ANTLR ne supporte pas quelque chose comme {1,5} alors c'est le même que: Ce qui n'est pas si propre, alors peut-être qu'il y a une meilleure façon de le faire.

+0

'{a, b}' n'est pas supporté par ANTLR. –

+0

Hey Bart, C'est un bon conseil - merci pour votre temps, je l'apprécie vraiment. Brgds et merci, Michael –

+0

Le commentaire aurait dû être de "danben" - merci. Mais tu as raison Bart. Le support d'expression reggulaire d'Antlr aurait pu être meilleur. –

1

Cette tâche ressemble à une surcharge excessive pour ANTLR, quelle que soit la raison pour laquelle vous ne divisez pas la chaîne en un tableau en utilisant le '+' comme séparateur?

Si cela venait d'un ordinateur central, il était très probablement destiné à être traité d'une manière triviale.

par exemple.,
C++: http://www.cplusplus.com/reference/clibrary/cstring/strtok/
PHP: http://us3.php.net/manual/en/function.explode.php
Java: http://java.sun.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29
C#: http://msdn.microsoft.com/en-us/library/system.string.split%28VS.71%29.aspx

Juste une pensée.

+0

Étant donné que nous n'avons aucune idée de la façon dont ses expressions (Es) analysent, les expressions régulières peuvent ne pas être appropriées. – danben

+0

Salut Walt, Il est plus compliqué que la question ne le suggère avec une gamme de différents messages, structures de données etc., mais merci quand même. Brgds, Michael –