2015-10-21 1 views
-4

Je tokenizing une chaîne telle que:Analyse lexicale: Commentaires à la fin de la ligne

BAS = W34 N29 E24 S29 $ FOP = E6 S6 W6 N6 $. Un commentaire

La période est le caractère "fin de commande", pas un caractère "début de commentaire". Comment puis-je ajouter une règle d'expression régulière au lexeur de sorte que la période soit un jeton à lui-même, mais quoi que ce soit après la période est un jeton de type COMMENT? J'ai essayé /\..+$/, mais cela inclut la période dans le commentaire.

+0

Quel programme utilisez-vous? – melpomene

+0

Que diriez-vous pas période '(? <= [.]) [^.] + $' – sln

+0

J'ai écrit le lexer moi-même en C#, il utilise des expressions régulières .NET. C'est un peu comme http://blogs.msdn.com/b/drew/archive/2009/12/31/a-simple-lexer-in-c-that-uses-regular-expressions.aspx (voir la section Implémentation – Chet

Répondre

2

Vous pourriez essayer pourrait 2 façons, un groupe non-capture, ou un regard-behind (qui est aussi non-capture):

(?:\.).+$ 

(?<=\.).+$ 
+2

Le premier pattern inclura la période dans le match (et donc il le consommera). Le second est bien. –

+0

Un look-behind n'est pas seulement non-capture, il est non-consommation. Un groupe non-capturant "consomme" des caractères. –

+0

Le deuxième a travaillé pour moi, merci! – Chet

0

Il est difficile de répondre sans connaître les outils réels impliqués, mais envisagez d'inverser la logique: utilisez une expression régulière telle que /^.+\./ pour détecter une commande, et tout ce qui suit est un COMMENT.