2.文の識別

[例題のプログラミング言語の文法]

言語処理プログラムで最初に行うのは,1文を取り出す処理,
すなわち1文を識別します。

言語によっては,

 ■1行の中に複数の文
 ■2行以上で1文
 ■プログラムとは関係のない注釈が含まれる

などを処理する必要があります。

文の終わりの識別を,語彙解析の処理途中で行うと,
処理が複雑になってしまいますので,
最初にこの判定を行います。

ただし,文の中には,文字列等も含まれますので,
文字列範囲識別の最低限の処理が必要となります。

[プログラム例]

プログラムはtextBox1に入っているものとしています。
したがって,textBox1のMultiLineプロパティをtrueにしてください。

以下の例では,
行内で文を分離するときは,コロン(:)で区切り,
次の行に継続するときは,アンダーバー(_)を行の最後に付けることにしています。

なお,簡単化のために,注釈に関する処理は行っていません。

もし,必要であれば,注釈が含まれていても良いように
変更してみてください。

(注釈表現の例: ”//”がきたら次の\nまたは\rまで無視する)

  public int ptrText;
  public string AllText;
  private string 文取り出し() // 全ソースの中から1文を取り出す
  {
    string S="";
    while(ptrText<AllText.Length)
    {
      if(AllText[ptrText]=='\n'||AllText[ptrText]=='\r'){ptrText++;return S;}
      else if(AllText[ptrText]==':') {ptrText++;return S;}
      else if(AllText[ptrText]=='_')
      {
        ptrText++;
        while(ptrText<AllText.Length)
        {
           if(AllText[ptrText]=='\n'||AllText[ptrText]=='\r')break;
          ptrText++;
        }
        ptrText++;
      }
      else if(AllText[ptrText]==‘“’)
      {  // 文字列内処理
        S += AllText[ptrText].ToString();
        ptrText++;
        while(ptrText<AllText.Length)
        {   if(AllText[ptrText]=='\n'||AllText[ptrText]=='\r')
           { MessageBox.Show("ダブルクォーテーション(\")が足りません");
            return S;
            }
           else if(AllText[ptrText]=='"')
           {
             S += AllText[ptrText].ToString(); ptrText++;
             if((ptrText>=AllText.Length) || (AllText[ptrText]!='"')) break;
           }
           S+=AllText[ptrText].ToString();
           ptrText++;
         }
       }
       S=S+AllText[ptrText].ToString();
       ptrText++;
     }
     return S;
  }
  private void 全文取出し() // テキストボックスの内容をソースプログラムとする。
  { AllText=textBox1.Text; ptrText=0; }


    目 次

1.言語プロセッサの処理

2.文の識別

3.語彙解析

4.逆ポーランド記法

5.構文解析とコード生成

6.インタプリタ


ダウンロード
(以下をクリックするとダウンロードできます)

逆ポーランド記法への変換
本記事で示すソースプログラム例