2016-10-21 1 views
2

Je travaille sur une nouvelle grammaire antlr qui est similaire à nattys et qui devrait reconnaître les expressions de date, mais j'ai des problèmes avec les règles de saut. Plus en détail, je veux ignorer les expressions inutiles "et" dans les expressions par exemple:comment sauter "et" avec la règle de saut?

Appelez Sam, John et Adam et fixer une réunion avec Sarah sur les finances lundi et vendredi.

Les deux premiers "et" sont inutiles. J'ai écrit la règle ci-dessous pour résoudre ce problème, mais cela n'a pas fonctionné, pourquoi? que devrais-je faire?

NW : [~WeekDay]; 
    UselessAnd : AND NW -> skip; 
+0

Je ne pense pas que vous pouvez composer des règles lexer non-fragment comme ça. – Mephy

+0

@Mephy alors que dois-je faire? Je dois résoudre ce problème parce qu'il analyse l'expression avec inutile et faux. pourrait-il être possible de résoudre ce problème avec des blocs de code? –

+0

Vous ne pouvez pas annuler un mot dans la lexeur d'ANTLR, seulement des caractères simples. '[~ WeekDay]' correspond à l'un des caractères suivants: '~', 'W',' e', 'k',' D', 'a' ou' y' (et '~ [WeekDay]' correspond à tout caractère sauf W, E, K, D, A et Y). Mais ANTLR n'est pas bien adapté pour analyser les langues naturelles. Je vous suggère de faire une recherche sur "traitement du langage naturel". Notez que Natty n'analyse pas les phrases complètes que vous avez publiées. –

Répondre

4

"Useless AND" est un concept sémantique.

Les grammaires concernent la syntaxe et gèrent mal les problèmes sémantiques. Ne les combinez pas ensemble. Suggestion: lorsque vous écrivez une grammaire pour une langue, faites en sorte que votre analyseur accepte la langue telle qu'elle est, les verrues et tout. Dans votre cas, je vous suggère de "collecter" les AND inutiles. De cette façon, vous pouvez obtenir plus facilement la grammaire, et plus facilement le codeur suivant qui doit maintenir votre grammaire. Une fois que vous avez l'AST, il est assez facile d'ignorer (sémantiquement) les choses inutiles; si rien d'autre, vous pouvez post-traiter l'AST et supprimer les nœuds AND inutiles.

+2

Mes mots exactement. Ne laissez pas un outil syntaxique (un analyseur syntaxique) effectuer des tâches sémantiques. Ce n'est pas fait pour ça. –