2017-08-20 4 views

答えて

0

リスナーパターンを独自のListenerクラスで使用するときは、の入力はすでに正しくレキシングされており、解析されているのはです。したがって、あなたの質問に対する答えは「いいえ」です。リスナーを使用しているときは、通常、ポスト・パース後のツリーを歩いているだけです。

これはすべてが失われていることを意味しますか?もちろん違います。 は、「無視」したいコンストラクトに対して、EnterイベントまたはExitイベントをコーディングしないだけです。それは簡単です。彼らは途中、私はそれらを実装するに

if文をプログラムする方法については、私はあなたにのぞき見をあげる:場合-else文、私はいつもこのようなビジターパターンを使用してそれらを実装してきたように

public override MuValue VisitIfstmt(LISBASICParser.IfstmtContext context) 
    { 
     LISBASICParser.Condition_blockContext[] conditions = context.condition_block(); 
     bool evaluatedBlock = false; 
     foreach (LISBASICParser.Condition_blockContext condition in conditions) 
     { 
      MuValue evaluated = Visit(condition.expr()); 
      if (evaluated.AsBoolean()) 
      { 
       evaluatedBlock = true; 
       Visit(condition.stmt_block()); 
       break; 
      } 
     } 
     if (!evaluatedBlock && context.stmt_block() != null) 
     { 
      Visit(context.stmt_block()); 
     } 
     return MuValue.Void; 
    } 

許可されていますが、これはおそらく文脈からは分かりませんが、安心して動作します。これを完全な文脈で見るには、文法と実装の優れた例についてはBart Kiersをご覧ください。

+0

JUSTリスナーを使用してif-elseステートメントを実装できますか? –

+0

@BreatheHacker if-elseに関する私の更新の回答をご覧ください。いったんこのパターンを学ぶと、リスナーだけを使ってそれができるかどうかを見直すことはありません。 – TomServo

+0

助けてくれてありがとう。 –