1

私が解析したいテキストの例は次のとおりです-

@comment {
    { something }
    { something else }
}

基本的に「@comment」は検索の鍵であり、その後は一致する中括弧のペアです。中括弧の間にあるものを解析する必要はありません。これはCの複数行のコメントに似ているので、それに基づいた文法があります。

grammar tryit;


tryit : top_cmd 
        ;

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

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

top_cmd :cmds 
        ;

cmds
    : cmd+
    ;

cmd
    : Comment
    ;

Comment
    : AtComment    Open_Brace  ( options {greedy = false; }: . )+  Close_Brace
    ;

AtComment
    : '@comment'
    ;

Open_Brace
    : '{'
    ;

Close_Brace
    : '}'
    ;

しかし、ANTLRWORKSでのテストでは、EarlyExitExceptionがすぐに発生します。

何が悪いのか分かりますか?

4

1 に答える 1

1

私が見る2つの問題があります:

  1. "@comment"と最初の間のスペースを考慮していません"{"。スペースは、レクサールールではなく、パーサールールのHIDDENチャネルに配置されることに注意してください。
  2. ( options {greedy = false; }: . )+バランスの取れた中括弧ではなく、最初の括弧と一致しているだけです"}"

代わりに次のようなものを試してください。

tryit
 : top_cmd 
 ;

top_cmd
 : cmds 
 ;

cmds
 : cmd+
 ;

cmd
 : Comment
 ;

Comment
 : '@comment' ('\t' | ' ')* BalancedBraces
 ;

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

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

fragment
BalancedBraces
 : '{' (~('{' | '}') | BalancedBraces)* '}'
 ;
于 2013-02-21T17:23:16.653 に答える