2011-07-12 4 views
2

自分の言語から他の多くの(すべての)オブジェクト指向言語に翻訳者を作成します。言語の一部として、ターゲット言語コードセクションをファイルに挿入できるようにサポートしたいと考えています。これはAntlrがルール内のアクションをどのようにサポートしているかと実際は似ています。Antlrを使用してファイル内の非構造化セクションを解析する方法

だから私はセクションを持ってできるようにしたいが始まると、このような中括弧で終わる:

{ ...target lang code... } 

問題は、それが{...}かなり可能であるということであるターゲット言語に表示することができますコードでは、カーリーのペアを一致させる必要があります。私が行うことができるようにしたいどのような

は、私は、独自の文法に引き込まれました。このフラグメントのようなものです:

grammar target_lang_block; 

options 
{ 
    output = AST; 
} 

entry 
    : target_lang_block; 

target_lang_block 
    : '{' target_lang_code* '}' 
    ; 


target_lang_code 
    : target_lang_block 
    | NO_CURLIES 
    ;  

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

NO_CURLIES 
    : ~('{'|'}')+ 
    ; 

この文法はそれ自体で動作します(少なくとも限り、私はそれをテストしています) 。

しかし、これらのルールをより大きな言語に入れると、NO_CURLIESはすべてを食べて、MismatchedTokenExceptionsを引き起こすようです。

私はこのような状況に対処する方法がわかりませんが、私がしたいのは、target_lang_blockにあるかどうかに基づいてNO_CURILESをオンとオフにすることができるように思われますが、 。

可能ですか?別の方法がありますか?

おかげ

答えて

2

ではなく、レクサー内target_lang_blockハンドル:

Target_lang_block 
    : '{' (~('{' | '}') | Target_lang_block)* '}' 
    ; 

そしてもちろん、NO_CURLIESを削除します。

+0

もう一度Bart!パーサー/レクサーの作成の微妙さを学ぶための本の推奨事項 – mtru1010

+0

@ mtru1010、解析の理論に関する本の良いリストは[この前のQ&Aで](http://stackoverflow.com/questions/4922413/books-sites-on-parsing-theory)Stackoverflowで見つけることができます。 ANTLRを最大限に活用する方法に関する本は、間違いなくParrの[The Definitive ANTLR Reference](http://pragprog.com/book/tpantlr/the-definitive-antlr-reference)です。そして、あなたは大歓迎です! –

関連する問題