Antlr y DSL de análisis para los simulado: el manejo de espacio en blanco

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

  •  05-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de desarrollar un mini DSL para la configuración del software, usando antlworks para la creación de prototipos. Una fuente típica se vería así:

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

Ahora, nunca tuve un curso formal de análisis, por lo que estoy haciendo todo esto por ensayo / error de antlworks y algunos conceptos básicos sobre las gramáticas de BNF. Un problema constante que encuentro es un espacio en blanco y el manejo de nueva línea. Definí algo así 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'|'_')*;

Sin embargo, la manipulación de espacio en blanco es muy verde, se rompe para todo tipo de casos. Lo que la forma habitual de hacer esto? ¿Hay algún recurso para aprender este tipo de cosas rápidamente (algo así como la construcción de una calculadora con condicional y las variables en antlr - las gramáticas Antlr he encontrado son o lenguas triviales y fledge completo).

¿Fue útil?

Solución

Por lo general, podría hacer esto mediante la adición

{ $channel=HIDDEN; }

acción a la regla WS; ver esta página, sección de reglas Lexer para más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top