2015-07-14 1 views
0

J'essaie de créer une grammaire qui analyse un fichier ligne par ligne. Lorsque j'envoie le lexem 'Object o' à la grammaire, la sortie est ANY au lieu de OBJ.Antlr4 ne reconnaît pas les identifiants

'Object o' => 'ANY' // I would like OBJ 

Je sais que ANY_STRING est plus long mais j'ai écrit des jetons lexer dans l'ordre. Quel est le problème ?

Merci beaucoup pour votre aide! ;)

+0

Le comportement lexer doit correspondre à la chaîne la plus longue, comme vous l'avez mentionné. La règle d'ordre n'a pas d'importance si la longueur est différente. – Mephy

+0

Oh ok merci. Alors, comment résoudre ce problème? – Maluna34

+0

Toutes vos questions sur SO ont été un peu vagues. C'est probablement la raison pour laquelle vous n'avez reçu aucune réponse. Pensez à publier les données réelles que vous essayez d'analyser et expliquez comment exactement vous voulez que ces entrées soient segmentées/analysées. –

Répondre

1

Pour les règles lexer, la règle dont la correspondance est la plus longue est indépendante de l'ordre des règles. Si la longueur du match est la même, la première règle listée gagne.

Pour rendre l'ordre des règles sens, réduire la longueur de correspondance possible de la règle ANY_STRING être identique ou inférieur à un mot clé ou id:

ANY_STRING: ~(' ' | '\n' | '\t') ; // also?: '\r' | '\f' | '_' 

Mise à jour

Pour voir ce que les lexer est en train de faire, dump the token stream.

+0

Merci. Donc je dois signaler la répétition de caractères à la règle associée? – Maluna34

+0

Votre question n'est pas comprise. Veuillez réessayer. – GRosenberg

+0

J'ai donc enlevé le '+' du jeton ANY_STRING et je l'ai mis dans la règle anyString. Donc j'ai ceci avec la même première grammaire: ANY_STRING: ~ ('' | '\ n' | '\ t'); anyString: ANY_STRING +; Mais ici, tout autre mot n'est plus reconnu. Par exemple j'ai l'erreur suivante "ligne 2: 0 aucune alternative viable à l'entrée" public "". Je pense qu'il est reconçu comme un ID au lieu de anyString. Il y a une solution? – Maluna34