Разбор ANTLR и DSL для манекенов: обработка пробелов - PullRequest
2 голосов
/ 06 апреля 2009

Я пытаюсь разработать мини DSL для конфигурации программного обеспечения, используя antlworks для создания прототипов. Типичный источник будет выглядеть так:

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

Теперь у меня никогда не было официального курса по синтаксическому анализу, поэтому я делаю все это методом проб / ошибок из antlworks и некоторыми основами грамматики BNF. Одна постоянная проблема, с которой я сталкиваюсь - это пробелы и обработка новой строки. Я определил что-то вроде

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

Но обработка пробелов очень глючная, она ломается для всех случаев. Какой это стандартный способ сделать это? Есть ли какой-нибудь ресурс для быстрого изучения такого рода вещей (например, создание калькулятора с условными и переменными в antlr - грамматики antlr, которые я нашел, являются либо тривиальными, либо полноценными языками).

1 Ответ

4 голосов
/ 07 апреля 2009

Обычно вы делаете это, добавляя

{ $channel=HIDDEN; }

действие по правилу WS; Подробнее см. на этой странице, раздел Правила Lexer .

...