2017-08-29 4 views
0

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.

+0

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. –

+0

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'). –

+0

Contexte ajouté à ma question. – ccleve

Répondre

0

ANTLR n'est pas le bon outil pour cette tâche. Un analyseur normal est conçu pour un langage spécifique, c'est-à-dire un ensemble de phrases composé d'éléments connus au moment de la création de l'analyseur. Il existe des moyens de rendre cela plus flexible, par ex. en utilisant une fonction d'exécution dans un prédicat pour reconnaître des mots non définis dans la grammaire, mais cela a d'autres implications (négatives).

Ce que vous devriez considérer est NLP pour une approche différente pour traiter le langage naturel. C'est plus que simplement sauter des choses entre deux jetons connus.

+0

En désaccord. Sous le capot, la PNL utilise des lexers et des tokenizers pour analyser le texte. Les lexers de pipeline et les processeurs de jetons qui ont des connaissances spécifiques à la langue sont la façon dont la PNL est construite. Je le fais depuis des années dans JFlex et JavaCC et j'aimerais maintenant passer à Antlr. – ccleve