2010-03-29 5 views
1

Puis-je construire un jetonLexer antlr3 problème jeton

ENDPLUS: '+' (options (greedy = false;):.) * '+' 
     ; 

étant considéré par le lexer que si elle est précédée d'un jeton PRE sans inclure dans ENDPLUS?

PRE: '<<' 
     ; 

Merci.

Répondre

1

Non, je pense que ce n'est pas possible "prêt à l'emploi". On n'a que look-ahead-control sur le flux de jetons dans la lexeur ou l'analyseur en utilisant l'attribut input et en appelant LA(int) (anticipation) dessus. Par exemple, la règle de lexer suivante:

Token 
    : {input.LA(2) == 'b'}? . 
    ; 

correspond à un seul caractère aussi longtemps que ce caractère est suivi d'un b. Malheureusement, il n'y a aucune fonctionnalité input.LA(-1) à regarder derrière dans le flux de jetons. La partie {...}? est appelée un "prédicat syntaxique" au cas où vous vous poseriez la question ou si vous souhaitiez l'utiliser.

Une discussion, et quelques conseils sur la façon de s'y prendre pour résoudre, sont donnés ici: http://www.antlr.org/pipermail/antlr-interest/2004-July/008673.html

Notez qu'il est {greedy=false;}, pas (greedy=false;).

+0

En regardant le code de IntStream.java, les entiers négatifs sont autorisés en tant que paramètre à LA et recevront des jetons correspondants. Donc, il suffit de vérifier les jetons correspondants avant, espérons que nioo peut limiter jusqu'à quel point vérifier. Peut-être que d'autres langages sont différents, mais Java vous permettra de vérifier les jetons antérieurs. – WayneH

+0

@WayneH, je vais vérifier, merci. J'espère que nioo vous lira aussi un commentaire. –