ANTLR e DSL de análise para manequins: manipulação de espaços em branco

StackOverflow https://stackoverflow.com/questions/722921

  •  05-09-2019
  •  | 
  •  

Pergunta

Eu estou tentando desenvolver um mini DSL para a configuração do software, usando antlworks para prototipagem. Uma fonte típico seria algo como:

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

Agora, eu nunca tive um curso formal em análise, por isso estou fazendo tudo isso por tentativa / erro do antlworks e algumas noções básicas sobre gramáticas BNF. Uma constante problema que eu encontro é um espaço em branco e manuseio de nova linha. I definido algo como

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'|'_')*;

Mas a manipulação espaço em branco é muito buggy, ele quebra para todo o tipo de casos. O que a maneira padrão de fazer isso? Existe algum recurso para aprender este tipo de coisas rapidamente (algo como a construção de uma calculadora com condicional e variáveis ??em antlr - o antlr gramáticas eu encontrei são linguagens tanto triviais e full-fledge).

Foi útil?

Solução

Normalmente, você faria isso adicionando

{ $channel=HIDDEN; }

ação para a regra WS; consulte desta página, as regras lexer seção para mais detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top