2

プロトタイピングに 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 文法は、自明で本格的な言語のいずれかです)。

4

1 に答える 1

4

通常、これを行うには、追加します

{ $channel=HIDDEN; }

WSルールに対するアクション。詳細については、このページのセクション Lexer rulesを参照してください。

于 2009-04-06T20:09:16.930 に答える