2009-04-06 9 views
2

J'essaie de développer un mini DSL pour la configuration logicielle, en utilisant antlworks pour le prototypage. Une source typique ressemblerait à ceci:Analyseur ANTLR et DSL pour mannequins: gestion des espaces

name: myname; 
value: myvalue; 
flag debug { 
    value = debugvalue; 
} 
if flag(debug) { 
    libname = foo_d; 
} else { 
    libname = foo; 
} 

Maintenant, je ne ai jamais eu un cours formel sur l'analyse syntaxique, alors je fais tout cela par essai/erreur de antlworks et quelques notions de base sur la BNF grammaires. Un problème constant que je rencontre est la gestion des espaces et des retours à la ligne. J'ai défini quelque chose comme

program: statement* EOF; 

statement: compound_statement | selection_statement | field_statement; 
selection_statement: 'if' expr statement; 
statement_list: (WS* statement)+; 
compound_statement: '{' statement_list? '}'; 
field_statement: name_statement | value_statement; 
name_statement: 'name' WS* ':' WS* WORD WS* ';'; 
value_statement: 'value' WS* ':' WS* WORD WS* ';'; 

// Tokens 
WS : (' ' | '\t' | '\n'); 
WORD: ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*; 

Mais la gestion des espaces est très buggué, il casse pour toutes sortes de cas. Qu'est-ce que c'est la façon standard de faire ça? Y at-il une ressource pour apprendre ce genre de choses rapidement (quelque chose comme la construction d'une calculatrice avec conditionnelle et les variables dans antlr - les grammaires antlr que j'ai trouvées sont des langages triviaux et à part entière).

Répondre

4

Habituellement, vous le feriez en ajoutant

{ $channel=HIDDEN; } 
l'action

à la règle WS; Voir this page, section Lexer rules pour plus de détails.

+0

merci. Je pourrais jurer que j'ai essayé cela sans succès, mais avec la documentation, je pourrais le faire fonctionner comme prévu. –

+0

également, une fois que vous faites cela, vous ne devriez pas avoir besoin d'inclure WS dans vos règles d'analyseur. –