2017-05-14 9 views
-4

でこのロジックを記述することができ、次のルールで仮想的なプログラミング言語を考えてみましょう:各関数は、各関数の最後に「BEGIN」とその名前 キーワードで始まりどのように私はC

、キーワードが存在しなければなりません"終わり"。

関数を呼び出すには、関数の名前の直前にキーワード "CALL"を使用します。キーワード "EXECUTE"は、 "別の関数の助けを借りずに作業を行う"ことを意味します。

「完了」という単語は、この課題で私たちの関心事ではありません。 プログラムは常に "BEGIN Main"という行で始まります。

上記のルールに関していくつかのコードが記述され、 "code.prog"というファイルに格納されているものとします。このファイルでは、各行の先頭に "行番号"が存在すると仮定します。

このコード(code.prog)を読み取って実行を行番号で出力するCプログラムを作成します。 このジョブでは、関数呼び出しの行番号のスタックを作成することになっています。したがって、さらに、「関数呼び出し」と「関数終了」ごとにスタックの内容を出力します。コードの

EXAMPLE 
code.prg // this is the file 
1 BEGIN Fun1 
2 CALL Fun2 
3 EXECUTE 
4 END 
5 BEGIN Fun2 
6 EXECUTE 
7 END 
8 BEGIN Main 
9 EXECUTE 
10 CALL Fun1 
11 END 

出力:

Execution Order of Lines: 
8  
9  
10 Stack = 10 
1  
2 Stack = 2 10 
5  
6  
7 Stack = 10 
3  
4 Stack =  
11 --- END --- 
+1

問題を解決してユーザーに解決させるプログラミングコンテストサイトではありません。多くのチュートリアルとオンラインプログラミングコンテストサイトがあります。それを試してみてください。もしあなたが間違っていたら、そのエラーを解決しようとします。 –

+0

[this](http://ideone.com/QotaSJ) – BLUEPIXY

答えて

1

あなたはプログラミング言語が解析され、実行されている方法を知っている必要があります。 詳細については、Peter Van Royの "Concepts、Models and Techniques of Computer Programming"を読むことをお勧めします。

あなたのプログラミング言語は、構文、意味論、および用法によって構成されています。あなたの割り当てテキストは、プログラミング言語の文法規則(構文)を記述します。これらの規則は、あなたの言語で有効な文章を書くのに便利です。 有効な文章は、通訳者が理解してから実行することができます。 実行中は、基本的に各文に意味的意味を割り当てています。

これらは、手順は次のとおりです。

  1. はトークナイザを書きます。プログラミング言語の各単語はトークンです。 BEGINはトークンであり、CALLはトークンであり、関数名もトークン(関数識別子)である。トークナイザはソースコード(単純な文字列)を解析し、トークンのリストを作成します。 Text files -> [TOKENIZER] -> sequence of token
  2. パーサを作成します。センテンスは単語で構成され、同様にあなたのP.Lセンテンスはトークンで構成されます。トークンのどのシーケンスが有効かどうかを知るには、文法ルールを使用する必要があります。例えば。関数はBEGINトークンで始まり、その後にidentifierトークンが続き、その後に1つ以上のinstructionトークンが続き、ENDトークンで終わる必要があります。 構文木https://en.wikipedia.org/wiki/Parse_tree)を作成する必要があります。解析木のノードは非終端記号であり、葉は終結記号(トークン)である。 Sequence of token -> [PARSER] -> Parse tree
  3. インタープリタを作成します。各シンボルにセマンティックを割り当てる時間です。解析ツリーのルートから始めて、インタプリタは関連する命令を実行する各ノードを分析します。

実装:

トークナイザとパーサはただ有限状態機械です。 インタプリタは基本的に、実行スタック内の解析ツリーを変換するプログラムで、各命令がそこからポップアウトされて実行されます。