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; } 目 次 ダウンロード
|
|||||