Comment filtrer la séquence de jetons provenant de mon Lexer vers mon Parser lorsque j'utilise des combinateurs d'analyseurs Scala? Permettez-moi d'expliquer - supposons que j'ai le modèle assez standard d'un Lexer (extension StdLexical
) et un analyseur (extension StdTokenParsers
). Le lexeur transforme une séquence de caractères en une séquence de jetons, puis l'analyseur transforme la séquence de jetons en un arbre de syntaxe abstraite (de type Expr
).Filtrage des jetons depuis les Combinators Scala Parser
Je décide que certains jetons, qui pourraient se produire n'importe où dans le flux, je voudrais avoir la possibilité de filtrer, donc je voudrais une fonction qui conviendrait entre Lexer et Parser pour supprimer ces jetons. Par exemple, je pourrais vouloir que le lexer tokenise les commentaires, puis filtre ces commentaires plus tard.
Quelle est la meilleure façon d'écrire ce filtre? Cela pourrait utiliser l'idiome du combinateur d'analyseur, mais n'a pas à le faire.
code actuel Exemple:
val reader = new PagedSeqReader(PagedSeq.fromReader(reader))
val tokens = new MyParser.lexical.Scanner(reader)
val parse = MyParser.phrase(parser)(tokens)
Je voudrais pouvoir écrire quelque chose comme ceci:
val reader = new PagedSeqReader(PagedSeq.fromReader(reader))
val tokens = new MyParser.lexical.Scanner(reader)
val parse = MyParser.phrase(parser)(filter(tokens))
Je le fais déjà de manière appropriée. Je veux écrire le filtre comme décrit dans la question. L'application ne supprime pas les commentaires, c'est simplement la façon la plus simple d'expliquer le problème. –
Je l'ai écrit moi-même, puis je suis revenu et j'ai réalisé que vous aviez édité! Vous pouvez avoir la réponse acceptée, intéressant comment le code est si semblable. J'ai utilisé la récursivité et vous avez utilisé une boucle while, mais à part ça, ils sont presque les mêmes :-) –