1

ANTLRを使用してカスタムデータ定義言語を解析しています。言語としてCを使用しており、抽象構文木を出力しています。これまでのところ良好ですが、ドキュメントを追加する必要があり、フォームのブロックを許可する必要があります。

DOC
Free text here
ENDDOC

ルールを追加してみました:

docstm  :   'DOC' ContentDoc=(.*) 'ENDDOC' -> ^(T_DOCCLASS $ContentDoc); 

ここT_DOCCLASSで、はセクションで定義された架空のトークンtokens {...}です。残念ながら、DOC ... ENDDOCブロックの解析は失敗しませんが、ツリーにはT_DOCCLASS子ノードがないだけです。

その他の追加情報:ANTLR3.2と次のプレリュードを使用しています:

options {   
output   = AST;
language = C;
ASTLabelType = pANTLR3_BASE_TREE;
}

また、withespacesをスキップするための別のルールがあります。

WS  :   ( ' '
    | '\t'
    | '\r'
    | '\n'
    ) {$channel=HIDDEN;}
;

あなたが私に与えることができるどんな提案にも前もって感謝します。

4

1 に答える 1

1

(パーサー ルールでは 0 個以上のトークン!)の代わりに、 (以外の.*0 個以上のトークン) を実行する方が安全です。(~ENDDOC)*ENDDOC

docstm      : DOC innerDocstm ENDDOC -> ^(T_DOCCLASS innerDocstm); 
innerDocstm : (~ENDDOC)*;
DOC         : 'DOC';
ENDDOC      : 'ENDDOC';
ID          : ('a'..'z' | 'A'..'Z')+;
WS          : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;};

その結果:

ここに画像の説明を入力

ご覧のとおり、T_DOCCLASSAST 内にスペースはありません。スペースを保持したい場合は、ルールをレクサーに入れる必要があります。

DOCSTM : 'DOC' .* 'ENDDOC'; 

(今すぐ使用する必要があります.*)

于 2012-05-24T15:29:42.387 に答える