?? runtime.h
字號:
//RunTime.h
//inputfile: words.txt, sentence.txt, wordtable2.txt
//outputfile: runtime.txt
#ifndef RUNTIME_H_
#define RUNTIME_H_
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
/*****************************************************************************************
運行時刻環境
功能要求:
1。首先讀取sentence.txt文件,判斷各個變量是否在其作用域內出現。
2。從words.txt文件中將各個模塊分別讀取出,并分別保存在各組變量里。
3。從程序的入口點進入程序,按順序輸出到目標文件,并在函數調用時判斷此段函數代碼是否
寫過,如果沒寫過則將其寫到當前位置,如果寫過則轉移到以前寫過的位置。
步驟:
1。首先判斷各個變量是否出現在其作用域內,并返回正確或錯誤信息
2。分析words.txt文件,并將其分段落存入字符串組中去
比如下面一段代碼:
program example(input,output);
var x,y:integer;
procedure gcd(m,n:integer);
var n:integer;
begin
n:=m ;
end;
begin
read(x,y);
write(gcd(x))
end.
將其存到數組中:
Word[0][0]="var" Word[0][1]="id" Word[0][2]="," Word[0][3]="id" Word[0][4]=":"
...
..
Word[1][0]="var" Word[1][1]="id" Word[1][2]=":" Word[1][3]="def" Word[1][4]=";"
Word[1][5]="begin" Word[1][6]="ids" Word[1][7]=":" Word[1][8]="ids" Word[1][9]=";"
Word[1][10]="end" Word[1][11]=";"
并記錄信息:
Segment[1]=0; //記錄此變量的段落編號
//以及各個參數信息
ParamentCount[0]=2 Parament[0][1]="input" Parament[0][2]="output"
Segment[6]=1;
ParamentCount[1]=2 Parament[1][1]="m" Parament[1][2]="n"
3。將分析好的代碼按照執行時的順序寫到文件中去,如果遇到函數調用,則在其所在語句前加一
個變量,使變量的值為此函數。
例如下面這段代碼:
program example(input,output);
var x,y:integer;
procedure gcd(m,n:integer);
var n:integer;
begin
n:=m ;
end;
begin
read(x,y);
write(gcd(x))
end.
將被轉換為:
var x,y:integer;
read(x,y);
gcd:
write(gcd(x))
******************************************************************************************/
class runTime
{
private:
ifstream fin1; //定義文件讀取指針
ifstream fin2; //定義文件讀取指針
ifstream fintable; //讀取變量表的指針
ofstream fout; //將各個模塊按照執行順序寫入到目標文件中去
int CurrentLine;
int Paraments;
int VariantIndex;
int VariantCount;
int VariantKind[100];
int VariantType[100];
int VariantHave[100];
int VariantBelong[100];
char VariantName[100][256]; //定義變量信息
char Temp[256];
char Errors[20][256]; //保存了各種錯誤代碼信息
int Error_Count; //記錄錯誤個數
char ErrorWord[256]; //記錄錯誤信息
char Word[10][100][256]; //記錄下每個模塊中每個詞的信息
int WordCount[10]; //記錄每個模塊里的單詞個數
double Value[10][100]; //記錄下每個詞的變量屬性
int Segment[100]; //返回每個模塊的編號值
int Segment2[100]; //設置一個模塊編號值的反查函數
int SegmentIndex;
int SegmentCount;
int ParamentCount[100]; //記錄參數個數
char Parament[100][10][256]; //記錄每個參數的名稱
int RunLayer;
int RunCount; //記錄運行時刻調用函數的位置
//包括層號和索引號
int Used[10]; //在進行寫操作時判斷此模塊是否被寫過
int Begin; //每寫一段的開始位置
int Index[10]; //記錄每個段所寫到的位置
int Layer; //段落層信息,遇到begin進棧,遇到end出棧
protected:
void Initialize(); //初始化各個參數和變量
int CheckWords(); //第一步:檢查所有的詞是否在自己的作用域內出現
void DefineError();
void CatchError(int num); //對錯誤的處理
void GetWords(); //從文件中讀取單詞
public:
int Compile();
void InitialWrite(); //初始化
void CreatCode(char* filename); //將代碼寫入文件
void ChangeWords(int num,int i); //將單詞進行回寫
void Write(int num); //將每個模塊的代碼寫入文件
};
void runTime::DefineError() //定義錯誤類型
{
strcpy(Errors[0]," not in it's active field ");
}
void runTime::InitialWrite() //對寫文件進行初始化,此段代碼在CreateCode部分
{
RunLayer=0;
RunCount=0;
for(int i=0;i<10;i++) Used[i]=0;
};
void runTime::CatchError(int num) //將錯誤信息直接輸出
{
Error_Count++;
cout<<"Error ("<<Error_Count<<"): \""<<ErrorWord<<"\" "<<Errors[num]<<" at line: "<<CurrentLine<<endl;
}
void runTime::Initialize()
{
fintable.open("wordtable2.txt"); //打開單詞表文件
Error_Count=0; //將各個變量進行初始化
DefineError();
while(fintable>>VariantIndex)
fintable>>VariantKind[VariantIndex]
>>VariantType[VariantIndex]
>>VariantName[VariantIndex]
>>VariantHave[VariantIndex]
>>VariantBelong[VariantIndex];
//將變量信息從單詞表中讀取出
}
int runTime::CheckWords()
{
int Value;
//int state=0;
fin1.open("sentence.txt");
while(fin1>>CurrentLine>>Paraments)
{
while(fin1>>Temp)
{
if(strcmp(Temp,";")==0) break;
if(strcmp(Temp,"ids")==0)
{
fin1>>Value;
if((VariantBelong[Value]!=0)&&(VariantBelong[Value]/100!=0)&&(VariantBelong[Value]/100!=Paraments))
//它的聲明既不在主程序中也不在此模塊內,說明調用錯誤
{
/*
輸出錯誤信息
*/
strcpy(ErrorWord,VariantName[Value]);
CatchError(0);
}
}
}
}
if(Error_Count==0)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -