2017-09-11 3 views
0

Ma grammaire doit ignorer les espaces pour la plupart, sauf dans certains contextes. Réponses à this question conseille de définir des règles lexer spécifiques pour gérer les exceptions que je veux. Le problème est que (je pense) je ne peux pas gérer de tels cas au niveau lexer, car ils semblent être déclenchés au niveau de l'analyseur.Ignorer les espaces sur une base de règle par analyseur dans Antlr4

Pour être plus précis: je veux reconnaître quelque chose comme

MyRule: 
    MyParseTree1 Operator MyParseTree2 // WS is skipped 
    | MyParseTree1 WS SensitiveOperator WS MyParse // WS carries meaning 

gardant à l'esprit que j'ai un WS -> sauter règle parce que dans la plupart de mes espaces blancs de grammaire devrait être sautée.

En Xtext, les règles peuvent spécifier une règle scope base que les jetons cachés appliquent dans la portée de la règle:

MyRule (hidden COMMENTS): 
    ... // WS reaches the parser, comments don't 

MyRule2 (hidden WS, COMMENTS): 
    ... // WS is skipped, comments too 

Mais je suis paumé avec antlr4.

+0

Vous ne pouvez pas non plus faire correspondre les espaces dans votre SensitiveOperator? –

+0

XText est une version pavée d'Antlr3. Beaucoup de concepts ne s'appliquent pas à Antlr4. Dans tous les cas, on dirait que vous essayez de résoudre un problème de lexer dans l'analyseur. Fournissez la règle de lexer réelle pour 'SensitiveOperator'. Confirmez que le vrai problème est qu'il nécessite un 'WS' avant et arrière. – GRosenberg

+0

Merci beaucoup pour les réponses. Je n'ai pas encore eu le temps de vérifier vos suggestions, mais je crois que la définition des opérateurs comme étant au fait du vide au niveau des lexers est la voie à suivre. Dès que je le verrai, je reviendrai et clôturerai la question. – AmazingWouldBeGreatBut

Répondre

1

Si vous voulez ignorer certains Tokens en fonction du contexte grammatical, vous devriez jeter un oeil à cette question here où la procédure donnée est décrite pour ignorer les espaces (comme vous voulez le faire).

+0

Merci. S'il vous plaît voir mon commentaire ci-dessus. – AmazingWouldBeGreatBut

+0

Accepter votre réponse parce que c'est une alternative valide à des règles just-lexer (que je n'ai pas encore pu faire fonctionner). – AmazingWouldBeGreatBut