質問

私は、プロトタイピングのためのantlworksを使用して、ソフトウェア構成のためのミニDSLを開発しようとしています。典型的なソースは次のようになります:

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文法は些細なフル育てるの言語のいずれかです)。

役に立ちましたか?

解決

通常、あなたが追加することでこれを行うだろう。

{ $channel=HIDDEN; }

WSルールへのアクション。 このページ、セクションレクサー詳細はのルールを参照。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top