2009-04-06 4 views
2

プロトタイプ作成のためにantlworksを使用して、ソフトウェア構成用のミニDSLを開発しようとしています。私は、構文解析の正式なコースをやったことがなかった、今ダミーのためのANTLRと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の文法は簡単で完全な言語です)。

答えて

4

通常、あなたはWSルールに

{ $channel=HIDDEN; } 

アクションを追加することでこれを行うだろう。詳細はthis page, section Lexer rulesを参照してください。

+0

ありがとうございます。私はこれを成功せずに試してみたいと誓っていたかもしれませんが、ドキュメンテーションでは意図どおりに動作させることができました。 –

+0

また、これを行うと、パーサーのルールにWSを含める必要はありません。 –

関連する問題