8
votes

Comment gérer les espaces optionnels dans ANTLR?

J'essaie d'analyser un fichier de données dans ANTLR - il dispose d'un espacement blanche optionnel illustré par xxx

indique où se trouve la ligne de démarrage et des extrémités. Il y a une nouvelle ligne à la fin et il n'y a pas d'onglets. xxx

ma grammaire est: xxx

ce qui donne < / p> xxx

(c'est-à-dire que le premier WS n'a pas été reconnu et la dernière ligne a été manquée).

Je voudrais analyser les lignes qui commencent sans blancheur, tels que: xxx

mais je reçois des erreurs telles que: xxx

J'apprécierais des explications générales de l'analyse de l'analyse WS en anti-antlr.

EDIT @JITTER a une réponse utile - {ignor = ws} n'apparaît pas dans le livre "Référence AntLR définitive" que je Je travaille de sorte qu'il s'agit clairement d'une zone délicate.

aide toujours nécessaire J'ai modifié ceci à: xxx

mais obtenir l'erreur: xxx

edit apparemment Cela a été supprimé de V3: http://www.antlr.org/pipermail/antlr-interest /2007-fèbre/019423.html


2 commentaires

+1, j'ai eu le même problème et j'ai fini par utiliser un hack majeur de l'analyseur citron. Suite à cela avec intérêt.


@Tinkertim merci - il est toujours agréable de savoir que la question n'est pas un mannequin complet.


3 Réponses :


2
votes

vérifier Analyse lexicale avec Antlr puis recherchez la pièce qui commence avec cet en-tête

Ignorer WhitSpace dans le LXER

Vous devez utiliser le {ignor = ws; } règle


2 commentaires

Merci - je vais essayer cela et faire rapport. FWIW Il y a des cas où le formatage exact compte également donc j'espère que je peux changer.


Modifier Il apparaît que ce n'est pas disponible en v3



1
votes

J'ai réussi à obtenir ce travail en utilisant des constructions Lexer telles que: xxx

mais pas dans la nouvelle ligne. Ensuite, dans les constructions d'analyseurs telles que: xxx

la touche consistait à supporter tout WS dans le LXER, à l'exception de la nouvelle ligne.


0 commentaires

10
votes
WS : (' ' | '\t')+
     {$channel = HIDDEN;}
   ;

1 commentaires

Version AntLR4: WS: ('' | '\ t') + -> canal (caché);