2017-04-21 1 views
0

javaccを使用してループを含むスクリプト言語用のインタープリタを作成しましたが文法を定義しましたが、実行を繰り返すために行をバックアップする方法はありませんブロックの "for"の値。 トークンマネージャをどのようにバックアップして、ループボディを再解析し、何度も何度も再評価することができますか?javaccでループを実装するには

void For(): {ArrayList<String> lst;Token n,v;int i=0;} { 

     "for" "(" n=<ID> ":" v=<ID> ")" "{" 
    (actions()";" )+ 
    "}" 


    } 

答えて

0

としては、JavaCCのFAQ(http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc7.3)で説明した、最善のアプローチは、出力に中間表現のいくつかの形態であり、その解釈します。いくつかの一般的なアプローチが続きます。

  • 1つの方法は、パーサからツリーを出力することです。その後、ツリーを解釈します。インタプリタは、インタプリタのデザインパターンを使用できます。 https://en.wikipedia.org/wiki/Interpreter_pattern

  • 2番目の方法は、仮想マシンのマシンコードに変換することです。このアプローチの例は、タートルトーク通訳者http://www.engr.mun.ca/~theo/Courses/sd/5895-downloads/turtle-talk.zipに見ることができます。

  • 第3の方法は、別の高レベルプログラミング言語に翻訳し、コンパイルして実行することです。

0

これは、通常、人々がメモリ内にデータ構造を構築して、コマンドグループが一度解析され、その後繰り返し実行される理由です。

今のところ純粋なインタープリタをしたいのであれば、ループ(つまり "for"トークン)と判明したトークンの開始位置を覚えておいて、トークンストリーム。ループの終わりを知るために、開始と終了の括弧( "{"と "}")を先にスキャンする必要があるかもしれません。

"for"コマンドは、実際のループから "if"ステートメントの変種に変更されます。条件が真であれば、コマンドを実行し、条件が偽であれば、閉じる "}"を含めてすべてを飛び越します。そして、あなたが "}"を押すと、 "for"の位置に戻り、再び条件をチェックします。私たちは、以下のようなJavaCode生産を使用することができます

+0

スキャンを先に進めるには、各bnfプロダクションにパラメータを追加して実行するかどうかを指定します。 if文を扱うには、とにかくこれが必要です。 JavaCCを使用して、これの難しい部分は、巻き戻しを行うことです。インタフェースは、生成されたトークンマネージャには存在しません。生成されたトークン・マネージャーをサブクラス化して、必要なインターフェースを追加することによって可能性があります。 –

0

はアクション()の生産は、各ラインの世話を提供します。 セミコロンをactions()Productionに移動してください。

TOKEN : { 
    <LCURLY : "{" > 
    <RCURLY : "}" > 
} 


void For(): {ArrayList<String> lst;Token n,v;int i=0;} { 
    "for" "(" n=<ID> ":" v=<ID> ")" <LCURLY> 
     loopBody(); 
    <RCURLY> 
} 

JAVACODE 
void loopBody() { 
    Token t = getNextToken(); 
    while (t.kind != RCURLY) { 
     actions(); 
     t = getNextToken(); 
    } 
} 

はこれが役立つことを願っています。

関連する問題