J'ai du mal à comprendre comment reconnaître un texte seulement s'il est précédé et suivi de certaines choses. La tâche est de reconnaître AND, OR et NOT, mais pas si elles font partie d'un mot:Antlr: exemples de lookahead et de lookbehind
Ils doivent être reconnus ici:
x AND y
(x)AND(y)
NOT x
NOT(x)
mais pas ici:
xANDy
abcNOTdef
ET est reconnu s'il est entouré d'espaces ou de parenthèses. NOT est reconnu s'il se trouve au début de l'entrée, précédé d'un espace et suivi d'un espace ou d'une parenthèse. Le problème est que si j'inclue des parenthèses dans la définition de AND ou NOT, elles sont consommées et j'ai besoin qu'elles soient des jetons séparés.
Y a-t-il une sorte de syntaxe lookahead/lookbehind que je peux utiliser?
EDIT:
par les commentaires, voici un contexte. Le problème est lié à ce problème: Antlr: how to match everything between the other recognized tokens? Ma solution de travail est juste de reconnaître ET, OU, etc. et de passer tout le reste. Puis, lors d'un second passage sur le texte, j'attrape manuellement les caractères qui ne sont pas couverts et exécute un tokenizer totalement différent. La raison en est que j'ai besoin d'un tokenizer personnalisé, spécifique au langage humain, pour ce contenu, ce qui signifie que je ne peux pas, à l'avance, décrire ce qu'est un identifiant. Chaque langue humaine est différente. Je veux combiner, par étapes, un seul tokenizer de langage de requête, puis appliquer un tokenizer en langage humain à ce qui reste.
Comment alors 'xANDy' et' abcNOTdef' devraient être marqués? Ceux-ci sont généralement identifiés comme une sorte de jeton d'identification, auquel cas vous ne devriez pas avoir de problème. Un peu plus de contexte sur ce que vous essayez d'analyser/tokenise serait vraiment utile. –
Bart a raison. Vous voyez un problème là où il n'y en a pas. Créez une règle pour 'AND' et une pour' ID' où 'ID' correspond à vos identifiants. Placez la règle de mot clé ('AND') avant la règle' ID' dans votre grammaire. Il apparaîtra quand 'and' entrera seul (par exemple entouré de blancs ou de non-id-chars). Sinon, 'ID' correspond et vous donne un identifiant (même ceux contenant les lettres' and'). –
Contexte ajouté à ma question. – ccleve