Question

J'essaie de construire un simple lexer / analyser avec Alex / Happy in Haskell, et je voudrais garder certaines informations de localisation du fichier texte dans mon AST final.

J'ai réussi à créer un lexer en utilisant Alex qui crée une liste de jetons avec localisation :

data Token = Token AlexPosn Foo Bar
lexer :: String -> [Token]

Dans mon fichier heureux, lors de la déclaration de la partie de jeton%, je peux déclarer quelle est la partie sémantique du jeton avec le symbole $$

%token FOO  { Token _ $$ _ }

et dans la règle d'analyse, le $i fera référence à ce $$.

foo_list: FOO  { [$1] }
        | foo_list FOO { $2 : $1 }

Existe-t-il un moyen de faire référence à la partie AlexPosn et à la partie Foo du jeton FOO ?Pour l’instant, je ne sais comment faire référence qu’à un seul d’entre eux.Je peux trouver des informations sur une manière d'« ajouter plusieurs $$ », et de m'y référer par la suite.

Y a-t-il un moyen de le faire ?

V.

Était-ce utile?

La solution

En fin de compte, j'ai trouvé 2 solutions:

  • emballez toutes les données de signification dans un tuple, de sorte que $$ point à ce tuple, puis extraire le Données par projection:

    data Token = Token (AlexPosn,Foo) Bar
    %token FOO { Token $$ some_bar }
    rule : FOO  { Ast (fst $1) (snd $1) }
    
  • N'utilisez pas de $$ du tout: si vous n'utilisez pas $$, heureux vous donnera le gage complet pendant l'analyse, il appartient donc à vous d'extraire ce que vous avez vraiment besoin de ce jeton:

    data Token = Token AlexPosn Foo Bar
    %token FOO = { Token _ _ some_bar }
    rule : FOO  { Ast (get_pos $1) (get_foo $1) }
    
    get_pos :: Token -> AlexPosn
    get_foo :: Token -> Foo
    

    ...

Je pense que le premier est le plus élégant.Le second peut être assez lourd en termes de lignes de code si vous portez beaucoup d'informations: vous devrez construire des "projections" à la main (assortie de motifs, etc.), et ainsi de faire de manière sûre peut être délicateSi votre type de jeton est assez gros.

Autres conseils

Il est également possible de conserver plusieurs valeurs comme celle-ci :

data Token = Token AlexPosn Foo Bar
%token FOO { Token pos foo some_bar }
rule : FOO { Ast pos foo }

Bien que je ne sois pas sûr que Happy garantisse réellement que cela fonctionnera toujours.La raison pour laquelle cela fonctionne (peut-être) est que happy générera du code sur lequel le modèle correspond Token pos foo some_bar, fabrication pos et foo disponible en Ast pos foo.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top