2010-10-31 6 views
1

Je suis en train de créer un analyseur ANTLR pour Lua. J'ai donc pris la grammaire produite par Nicolai Mainero (disponible sur le site de l'ANTLR, grammaire Lua 5.1) et commencé à travailler.ANTLR Lua règles de grammaire à longue chaîne

La grammaire est bonne. Une chose ne fonctionne pas: LONG STRINGS.

règle de spécification Lua literal

cordes peut également être définie à l'aide d'un long format placés entre crochets longs. Nous définissons une parenthèse d'ouverture longue de niveau n comme un crochet carré d'ouverture suivi de n signes égaux suivis de un autre crochet d'ouverture. Ainsi, une parenthèse d'ouverture de niveau 0 est écrit comme [[, une parenthèse d'ouverture longue de niveau 1 s'écrit [= [, et donc sur. Une parenthèse de fermeture longue est définie de manière similaire; par exemple, une longue parenthèse fermante de niveau 4 s'écrit ] ====]. Une longue chaîne commence par une longue parenthèse ouvrante et se termine à la première longue parenthèse fermante du même niveau. Les littéraux de cette forme encadrée peuvent s'exécuter pour plusieurs lignes , n'interpréter aucune séquence d'échappement et ignorer les longues parenthèses de tout autre niveau. Ils peuvent contenir n'importe quoi sauf un crochet de fermeture de le niveau approprié.

Ma question est proche par sens à this mais les outils sont différents.

Quelques petit exemple de LONGSTRING:

local a = [==[ Some interesting string [=[ sub string in string ]=] [hello indexes] [[And some line strings]] ]==] - its correct string. 
local f = [==[ Not interesting string ]=] - incorrect string 

Voici ma règle pour LONGSTRING avec out '=' symbole:

LONGSTRING: '[[' (~(']') | ']'(~(']')))* ']]'; 

quelqu'un peut me aider? Merci!

+1

Ne pas oublier les longs commentaires. Ils sont juste comme de longues chaînes, mais commencent par '- [[' et se terminent par ']]'. Naturellement, ils autorisent également 0 ou plus de signes '=' afin qu'ils puissent être imbriqués sans ambiguïté. – RBerteig

+0

@RBerteig, bon point. Je ne les ai pas mentionnés spécifiquement dans ma réponse, mais ils sont traités correctement dans l'extrait de la grammaire que j'ai posté. –

+0

@Bart, true, tant que votre règle pour un commentaire gère '" - "' suivi de 'LONGSTRING' sans espace. – RBerteig

Répondre

1

J'ai écrit une grammaire Lua selon les spécifications et a résolu le problème comme celui-ci:

grammar Lua; 

// ... options ... 

// ... tokens ... 

@lexer::members { 
    public boolean noCloseAhead(int numEqSigns) { 
     if(input.LA(1) != ']') return true; 
     for(int i = 2; i < numEqSigns+2; i++) { 
      if(input.LA(i) != '=') return true; 
     } 
     return input.LA(numEqSigns+2) != ']'; 
    } 

    public void matchClose(int numEqSigns) throws MismatchedTokenException { 
     StringBuilder eqSigns = new StringBuilder(); 
     for(int i = 0; i < numEqSigns; i++) { 
      eqSigns.append('='); 
     } 
     match("]"+eqSigns+"]"); 
    } 
} 

// ... parser rules ... 

String 
    : '"' (~('"' | '\\') | EscapeSequence)* '"' 
    | '\'' (~('\'' | '\\') | EscapeSequence)* '\'' 
    | LongBracket 
    ; 

Comment 
    : (BlockComment | LineComment) {skip();} 
    ; 

fragment 
BlockComment 
    : '--' LongBracket 
    ; 

fragment 
LineComment 
    : '--' ~('\r' | '\n')* ('\r'? '\n' | EOF) 
    ; 

fragment 
LongBracket 
@init {int openEq = 0;} 
    : '[' ('=' {openEq++;})* '[' ({noCloseAhead(openEq)}?=> .)* {matchClose(openEq);} 
    ; 

// ... more lexer rules ... 

Soyez prudent avec ce que vous trouvez sur le ANTLR Wiki! Comme son nom l'indique: c'est un wiki et on peut poster des choses assez facilement. La grammaire Lua que vous mentionnez est un bon début, mais il y a pas mal d'erreurs (les littéraux binaires ou hexadécimaux sont incorrects, au moins, au moment où je l'ai regardé ...).

Questions connexes