プロトタイピングに antlworks を使用して、ソフトウェア構成用のミニ DSL を開発しようとしています。典型的なソースは次のようになります。
name: myname;
value: myvalue;
flag debug {
value = debugvalue;
}
if flag(debug) {
libname = foo_d;
} else {
libname = foo;
}
現在、私は構文解析に関する正式なコースを受講したことがないため、antlworks の試行錯誤と BNF 文法のいくつかの基礎によって、これらすべてを行っています。私が遭遇する絶え間ない問題の 1 つは、空白と改行の処理です。私は次のようなものを定義しました
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 文法は、自明で本格的な言語のいずれかです)。