Comment puis-je inclure des guillemets pour la chaîne et les caractères dans le cadre de la chaîne. L'exemple est "This is a \" string" qui devrait entraîner une chaîne au lieu de "This is a \" comme une chaîne et string" comme une erreur dans ce cas. Idem pour les personnages. L'exemple est '\'', mais dans mon cas, c'est seulement '\'.

C'est ma solution actuelle qui ne fonctionne que sans guillemets.

CARACTÈRE : '\'' ~('\'')+ '\'' ;

CHAINE : '"' ~('"')+ '"' ;

0
David Trpcevski 22 févr. 2020 à 19:44

1 réponse

Meilleure réponse

Vos règles string/char ne gèrent pas correctement les séquences d'échappement. Pour le personnage, cela devrait être :

CHARACTER: '\'' '\\'? '.' '\'';

Ici, nous faisons en sorte que le caractère d'échappement (backshlash) fasse partie de la règle et exigeons qu'un caractère supplémentaire (quel qu'il soit) le suive. Similaire pour la chaîne :

STRING: '"' ('\\'? .)+? '"';

En utilisant +?, nous disons à ANTLR4 de faire la correspondance de manière non gourmande, en s'arrêtant au premier caractère de guillemet non échappé après le premier.

0
Mike Lischke 23 févr. 2020 à 08:56