分享
 
 
 

一个简单的C语言编译器

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

源代码:

//

//

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

#include <windows.h>

#include <string>

#include <fstream>

#include <list>

#include <stack>

#include <ctype.h>

using namespace std;

class Symbol

{

public:

int line;

string word;

char group;

Symbol();

Symbol(const Symbol &b);

virtual ~Symbol();

operator =(const Symbol &b);

string code;

};

class Label

{

public:

Label();

virtual ~Label();

string text;

private:

int n;

static int next();

static int _label;

};

class Action

{

public:

static int lookUp(char v,int s);

private:

Action();

~Action();

static int Table[54][19];

static string vs;

};

class Goto

{

public:

static int lookUp(char v,int s);

private:

Goto();

~Goto();

static int Table[54][9];

static string vs;

};

class Compiler

{

public:

optimize();

string code;

char nextChar();

preProcess();//预处理器

parser();//语法分析器

Symbol *lexer();//词法分析器

void emitter();//生成器

Compiler(string CmdLine);

virtual ~Compiler();

err(int no,int line);

int hasError;//错误发生状态

private:

int lookup(string m);

char currentChar;

string fileName;

int line;//行数状态

Compiler();

int hasFile;//源文件打开状态

int needOutSuppose;//输出支持状态

ifstream in;//输入CRR文件

ofstream log;//输出日志文件

ofstream out;//输出ASM文件

list<string> symbolList;//符号表

};

Compiler::Compiler(string CmdLine)

{

line=1;

hasError=0;

needOutSuppose=0;

hasFile=0;

fileName=CmdLine;

log.open((fileName + "_Log.txt").c_str(),ios::out);

//char c; //测试nextChar()

//do{c=nextChar();log<<c;}while(c!='#');log<<endl;

}

Compiler::Compiler()

{

}

Compiler::~Compiler()

{

log.close();

}

Symbol *Compiler::lexer()

{

char c;

int s=1;

Symbol *r;

r=new Symbol();

c=currentChar;

while(s){

switch(s){

case 1:

if(c=='\x0A')line++;

else if(isspace(c))

s=1;

else if(isalpha(c)||c=='_'){

s=2;

r->word=c;

}

else if(isdigit(c)){

s=3;

r->word=c;

}

else{

switch(c){

case '+':

case '-':

s=0;

r->word=c;

r->group='+';

r->line=line;

break;

case '*':

case '%':

s=0;

r->word=c;

r->group='*';

r->line=line;

break;

case '&':

case '|':

r->word=c;

s=4;

break;

case '>':

case '<':

r->word=c;

s=5;

break;

case '!':

r->word=c;

s=6;

break;

case '=':

r->word=c;

s=7;

break;

case ',':

case ';':

case '{':

case '}':

case '(':

case ')':

case '$':

s=0;

r->word=c;

r->group=c;

r->line=line;

break;

case '/':

r->word=c;

s=8;

break;

case '#':

s=11;

break;

default:

s=1;

err(1,line);

}

}

c=nextChar();

break;

case 2:

if(isalnum(c)||c=='_'){

s=2;

r->word+=c;

c=nextChar();

}

else{

s=0;

r->line=line;

if(r->word=="int")

r->group='z';

else if(r->word=="if")

r->group='i';

else if(r->word=="else")

r->group='e';

else if(r->word=="do")

r->group='d';

else if(r->word=="while")

r->group='w';

else if(r->word=="return")

r->group='r';

else

r->group='@';

}

break;

case 3:

if(isdigit(c)){

s=3;

r->word+=c;

c=nextChar();

}

else if(isalpha(c)||c=='_'){

s=2;

r->word+=c;

err(2,line);

c=nextChar();

}

else{

s=0;

r->line=line;

r->group='n';

}

break;

case 4:

if((r->word.c_str())[0]==c){

s=0;

r->word+=c;

r->group='&';

r->line=line;

c=nextChar();

}

else {

s=1;

err(3,line);

}

break;

case 5:

if(c=='='){

r->word+=c;

c=nextChar();

}

s=0;

r->line=line;

r->group='>';

break;

case 6:

if(c=='='){

r->word+=c;

r->group='>';

c=nextChar();

}

else{

r->group='!';

}

s=0;

r->line=line;

break;

case 7:

if(c=='='){

r->word+=c;

r->group='>';

c=nextChar();

}

else{

r->group='=';

}

s=0;

r->line=line;

break;

case 8:

if(c=='*'){

s=9;

r->word="";

c=nextChar();

}

else{

r->line=line;

r->group='*';

s=0;

}

break;

case 9:

if(c=='*')

s=10;

else

s=9;

c=nextChar();

break;

case 10:

if(c=='/')

s=1;

else if(c=='*')

s=10;

else

s=9;

c=nextChar();

break;

case 11:

if(c=='\n'){

s=1;

line++;

}

else

s=11;

c=nextChar();

break;

default:

s=1;

err(0,line);

c=nextChar();

}

}

currentChar=c;

log<<"词法分析:"<<r->word<<endl;

return r;

}

Compiler::parser()

{

log<<endl;

log<<"*******************************************"<<endl;

log<<"语法分析开始..."<<endl;

if(hasFile)

in.open((fileName+".crr").c_str(),ios::in);

currentChar=nextChar();//词法分析器初始化

// Symbol *s=NULL; //测试lexer()

// do{

// if(s!=NULL)

// delete s;

// s=lexer();

// log<<s->word;

// log<<" ";

// log<<s->group;

// log<<'\t';

// log<<s->line;

// log<<endl;

// }while(s->group!='#');

// delete s;

int r,s=1,t=1;

Symbol *ip,*iq,*it=NULL;

Symbol *s1,*s2,*s3,*s4,*s5,*s6,*s7,*m;

Label *l1,*l2;

stack<int> ss;

stack<Symbol *> sos;

ss.push(s);

ip=lexer();

while(t){

s=ss.top();

t=Action::lookUp(ip->group,s);

if(t>0){

sos.push(ip);

ss.push(t);

if(it==NULL)

ip=lexer();

else

ip=it;

it=NULL;

}

else if(t<0)

{

switch(-t)

{

case 1://OK

//D->@()S

log<<"语法分析:D->@()S"<<endl;

ss.pop();

ss.pop();

ss.pop();

ss.pop();

s4=sos.top();

sos.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='D';

m->line=s1->line;

sos.push(m);

//动作

if(s1->word!="main")

err(5,s1->line);

code=s4->code;

delete s1;

delete s2;

delete s3;

delete s4;

break;

case 2://OK

//S->@=E;

log<<"语法分析:S->@=E;"<<endl;

ss.pop();

ss.pop();

ss.pop();

ss.pop();

s4=sos.top();

sos.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='S';

m->line=s1->line;

sos.push(m);

//动作

if(lookup(s1->word))

m->code=s3->code+"\tpop ax\n\tmov "+s1->word+",ax\n";

else

err(10,s1->line);

delete s1;

delete s2;

delete s3;

delete s4;

break;

case 3://OK

//S->{W}

log<<"语法分析:S->{W}"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='S';

m->line=s1->line;

sos.push(m);

//动作

m->code=s2->code;

delete s1;

delete s2;

delete s3;

break;

case 4://OK

//S->i(G)S

ss.pop();

ss.pop();

ss.pop();

ss.pop();

ss.pop();

s5=sos.top();

sos.pop();

s4=sos.top();

sos.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='S';

m->line=s1->line;

sos.push(m);

//动作

if(s1->word=="if"){

l1=new Label;

m->code=s3->code+"\tpop ax\n\tcmp ax,1\n\tjne "+l1->text+"\n"+s5->code+l1->text+":\n";

delete l1;

log<<"语法分析:S->i(G)S"<<endl;

}

if(s1->word=="while"){

l1=new Label;

l2=new Label;

m->code=l1->text+":\n"+s3->code+"\tpop ax\n\tcmp ax,1\n\tjne "+l2->text+"\n"+s5->code+"\tjmp "+l1->text+"\n"+l2->text+":\n";

delete l1;

delete l2;

log<<"语法分析:S->w(G)S"<<endl;

}

delete s1;

delete s2;

delete s3;

delete s4;

delete s5;

break;

case 5://OK

//S->i(G)SeS

ss.pop();

ss.pop();

ss.pop();

ss.pop();

ss.pop();

ss.pop();

ss.pop();

s7=sos.top();

sos.pop();

s6=sos.top();

sos.pop();

s5=sos.top();

sos.pop();

s4=sos.top();

sos.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='S';

m->line=s1->line;

sos.push(m);

//动作

l1=new Label;

l2=new Label;

if(s1->word=="if"){

m->code=s3->code+"\tpop ax\n\tcmp ax,1\n\tjnz "+l1->text+"\n"+s5->code+"\tjmp "+l2->text+"\n"+l1->text+":\n"+s7->code+l2->text+":\n";

log<<"语法分析:S->i(G)SeS"<<endl;

}

else

err(8,s6->line);

delete l1;

delete l2;

delete s1;

delete s2;

delete s3;

delete s4;

delete s5;

delete s6;

delete s7;

break;

case 6://ok

//S->w(G)S

log<<"语法分析:S->w(G)S"<<endl;

ss.pop();

ss.pop();

ss.pop();

ss.pop();

ss.pop();

s5=sos.top();

sos.pop();

s4=sos.top();

sos.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='S';

m->line=s1->line;

sos.push(m);

//动作

delete s1;

delete s2;

delete s3;

delete s4;

delete s5;

break;

case 7://OK

//S->zL;

log<<"语法分析:S->zL;"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='S';

m->line=s1->line;

sos.push(m);

//动作

delete s1;

delete s2;

delete s3;

break;

case 8://OK

//S->@(E);

log<<"语法分析:S->@(E);"<<endl;

ss.pop();

ss.pop();

ss.pop();

ss.pop();

ss.pop();

s5=sos.top();

sos.pop();

s4=sos.top();

sos.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='S';

m->line=s1->line;

sos.push(m);

//动作

if(s1->word=="out"&&needOutSuppose)

m->code=s3->code+"\tpop ax\n\tcall outint\n";

else

err(6,s1->line);

delete s1;

delete s2;

delete s3;

delete s4;

delete s5;

break;

case 9://OK

//W->WS

log<<"语法分析:W->WS"<<endl;

ss.pop();

ss.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='W';

m->line=s1->line;

sos.push(m);

//动作

m->code=s1->code+s2->code;

delete s1;

delete s2;

break;

case 10://OK

//W->S

log<<"语法分析:W->S"<<endl;

ss.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='W';

m->line=s1->line;

sos.push(m);

//动作

m->code=s1->code;

delete s1;

break;

case 11://OK

//L->@

log<<"语法分析:L->@"<<endl;

ss.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='L';

m->line=s1->line;

sos.push(m);

//动作

if(!lookup(s1->word))

symbolList.insert(symbolList.end(),s1->word);

else

err(11,s1->line);

delete s1;

break;

case 12://OK

//L->L,@

log<<"语法分析:L->L,@"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='L';

m->line=s1->line;

sos.push(m);

if(!lookup(s3->word))

symbolList.insert(symbolList.end(),s3->word);

else

err(11,s3->line);

delete s1;

delete s2;

delete s3;

break;

case 13://OK

//G->G&M

log<<"语法分析:G->G&M"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='G';

m->line=s1->line;

sos.push(m);

//动作

if(s2->word=="&&")

m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tand ax,bx\n\tpush ax\n";

if(s2->word=="||")

m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tor ax,bx\n\tpush ax\n";

delete s1;

delete s2;

delete s3;

break;

case 14://OK

//G->M

log<<"语法分析:G->M"<<endl;

ss.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='G';

m->line=s1->line;

sos.push(m);

//动作

m->code=s1->code;

delete s1;

break;

case 15:

//M->E>E

log<<"语法分析:M->E>E"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='M';

m->line=s1->line;

sos.push(m);

//动作

l1=new Label;

l2=new Label;

m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tcmp ax,bx\n";

if(s2->word==">")

m->code+="\tjg "+l1->text+"\n";

if(s2->word=="<")

m->code+="\tjl "+l1->text+"\n";

if(s2->word=="==")

m->code+="\tje "+l1->text+"\n";

if(s2->word=="!=")

m->code+="\tjne "+l1->text+"\n";

if(s2->word==">=")

m->code+="\tjge "+l1->text+"\n";

if(s2->word=="<=")

m->code+="\tjle "+l1->text+"\n";

m->code+="\tmov ax,0\n\tjmp "+l2->text+"\n"+l1->text+":\tmov ax,1\n"+l2->text+":\tpush ax\n";

delete l1;

delete l2;

delete s1;

delete s2;

delete s3;

break;

case 16://OK

//M->!M

log<<"语法分析:M->!M"<<endl;

ss.pop();

ss.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='M';

m->line=s1->line;

sos.push(m);

//动作

m->code="\tpop ax\n\txor ax,ax\n\tpush ax\n";

delete s1;

delete s2;

break;

case 17://OK

//M->(G)

log<<"语法分析:M->(G)"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='M';

m->line=s1->line;

sos.push(m);

//动作

m->code=s2->code;

delete s1;

delete s2;

delete s3;

break;

case 18://OK

//E->E+T

log<<"语法分析:E->E+T"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->line=s1->line;

m->group='E';

sos.push(m);

//动作

if(s2->word=="+")

m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tadd ax,bx\n\tpush ax\n";

if(s2->word=="-")

m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tsub ax,bx\n\tpush ax\n";

delete s1;

delete s2;

delete s3;

break;

case 19://OK

//E->T

log<<"语法分析:E->T"<<endl;

ss.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='E';

m->line=s1->line;

sos.push(m);

//动作

m->code=s1->code;

delete s1;

break;

case 20://OK

//T->T*F

log<<"语法分析:T->T*F"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='T';

m->line=s1->line;

sos.push(m);

//动作

if(s2->word=="*")

m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tmul bx\n\tpush ax\n";

if(s2->word=="/")

m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tdiv bx\n\tpush ax\n";

if(s2->word=="%")

m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tdiv bx\n\tpush dx\n";

delete s1;

delete s2;

delete s3;

break;

case 21://OK

//T->F

log<<"语法分析:T->F"<<endl;

ss.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='T';

m->line=s1->line;

sos.push(m);

//动作

m->code=s1->code;

delete s1;

break;

case 22://OK

//F->(E)

log<<"语法分析:F->(E)"<<endl;

ss.pop();

ss.pop();

ss.pop();

s3=sos.top();

sos.pop();

s2=sos.top();

sos.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='F';

m->line=s1->line;

sos.push(m);

//动作

m->code=s2->code;

delete s1;

delete s2;

delete s3;

break;

case 23://OK

//F->@

log<<"语法分析:F->@"<<endl;

ss.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='F';

m->line=s1->line;

sos.push(m);

//动作

if(lookup(s1->word))

m->code="\tmov ax,"+s1->word+"\n\tpush ax\n";

else

err(10,s1->line);

delete s1;

break;

case 24://OK

//F->n

log<<"语法分析:F->n"<<endl;

ss.pop();

s1=sos.top();

sos.pop();

m=new Symbol;

m->group='F';

m->line=s1->line;

sos.push(m);

//动作

m->code="\tmov ax,"+s1->word+"\n\tpush ax\n";

delete s1;

break;

case 30:

//else

err(8,line);

ss.push(0);

ss.push(0);

ss.push(0);

ss.push(0);

ss.push(45);

s1=new Symbol;

s1->group='i';

s1->line=line;

sos.push(s1);

s1=new Symbol;

s1->group='(';

s1->line=line;

sos.push(s1);

s1=new Symbol;

s1->group='G';

s1->line=line;

sos.push(s1);

s1=new Symbol;

s1->group=')';

s1->line=line;

sos.push(s1);

s1=new Symbol;

s1->group='S';

s1->line=line;

sos.push(s1);

continue;

case 31:

err(7,line);

it=ip;

ip=new Symbol;

ip->group=';';

ip->line=line;

continue;

case 32:

err(9,line);

s1=new Symbol;

s1->line=line;

s1->group='S';

sos.push(s1);

break;

default:

err(4,ip->line);

goto label1;

}//switch

r=ss.top();

iq=sos.top();

r=Goto::lookUp(iq->group,r);

if(r)

ss.push(r);

else

err(4,iq->line);

}//else

else if(t==0&&!hasError){

log<<endl;

log<<"代码通过语法检查,未发现语法错误."<<endl;

}

}//while

label1:

in.close();

log<<"词法分析完毕..."<<endl;

log<<"*******************************************"<<endl;

}

Compiler::preProcess()

{

string tmpstr;

ifstream ins((fileName+".crr").c_str(),ios::in);

log<<"*******************************************"<<endl;

log<<"程序预处理开始"<<endl;

if(ins.is_open()){

hasFile=1;

log<<"打开文件 \'"<<fileName<<".crr\' 成功!"<<endl;

}

else{

hasFile=0;

log<<"打开文件失改!"<<endl;

}

while(getline(ins,tmpstr)){

if(tmpstr.substr(0,18)=="#import system.out"){

needOutSuppose=1;

break;

}

}

if(needOutSuppose)

log<<"需要引入系统函数\'System.out\'."<<endl;

else

log<<"不需要引入系统函数\'System.out\'."<<endl;

log<<"程序预处理完成!"<<endl;

log<<"*******************************************"<<endl;

ins.close();

}

char Compiler::nextChar()

{

char ch;

if(in.get(ch)){

currentChar=ch;

return ch;

}

else{

currentChar=ch;

return '$';

}

}

void Compiler::emitter()

{

if(hasError){

log<<endl;

log<<"*******************************************"<<endl;

log<<"源代码中有错误,不能生成目标代码!"<<endl;

log<<"*******************************************"<<endl;

return;

}

log<<endl;

log<<"*******************************************"<<endl;

log<<"开始生成目标代码..."<<endl;

out.open((fileName + ".asm").c_str(),ios::out);

if(out.is_open()){

log<<"创建文件"<<(fileName + ".asm").c_str()<<"成功!"<<endl;

out<<"\t.model small"<<endl;

out<<"\t.stack"<<endl;

out<<"\t.data"<<endl;

while(!symbolList.empty())

{

out<<symbolList.front().c_str()<<"\tdw ?"<<endl;

symbolList.pop_front();

}

out<<"__end\tdb 13,10,\'Press Any Key To Continue...\',\'$\'"<<endl;

out<<"\t.code"<<endl;

out<<endl;

if(needOutSuppose){

log<<"写入被引入系统函数代码."<<endl;

out<<"outint proc near"<<endl;

out<<"\tmov cx,0"<<endl;

out<<"\tmov bx,10"<<endl;

out<<"again:\tmov dx,0"<<endl;

out<<"\tdiv bx"<<endl;

out<<"\tpush dx"<<endl;

out<<"\tinc cx"<<endl;

out<<"\tcmp ax,0"<<endl;

out<<"\tjne again"<<endl;

out<<"print:\tpop dx"<<endl;

out<<"\tadd dl,30h"<<endl;

out<<"\tmov ah,02h"<<endl;

out<<"\tint 21h"<<endl;

out<<"\tloop print"<<endl;

out<<"\tmov dl,20h"<<endl;

out<<"\tmov ah,02h"<<endl;

out<<"\tint 21h"<<endl;

out<<"\tret"<<endl;

out<<"outint\tendp"<<endl;

out<<endl;

}

out<<"main\tproc near"<<endl;

out<<"\t;***CODE START***"<<endl;

log<<"开始优化代码."<<endl;

optimize();

log<<"优化代码完毕."<<endl;

out<<code;

log<<"写入目标代码."<<endl;

out<<"\t;***CODE END***"<<endl;

out<<"\tret"<<endl;

out<<"main endp"<<endl;

out<<endl;

out<<"start:"<<endl;

out<<"\tmov ax,@data"<<endl;

out<<"\tmov ds,ax"<<endl;

out<<"\tcall main"<<endl;

out<<"\tlea dx,__end"<<endl;

out<<"\tmov ah,09h"<<endl;

out<<"\tint 21h"<<endl;

out<<"\tmov ah,08h"<<endl;

out<<"\tint 21h"<<endl;

out<<"\tmov ah,4ch"<<endl;

out<<"\tint 21h"<<endl;

out<<"\tend start"<<endl;

out.close();

log<<endl;

log<<"代码生成完成!"<<endl;

log<<"*******************************************"<<endl;

}

else

{

log<<endl;

log<<"无法创建文件!"<<endl;

log<<"*******************************************"<<endl;

}

// Label *q;//测试Label

// for(int i=0;i<10;i++){

// q=new Label;

// log<<q->text.c_str()<<endl;

// delete q;

// }

return;

}

Compiler::err(int no,int line)

{

string errText;

hasError=1;

switch(no){

case 1:

errText="出现无法识别的符号.";

break;

case 2:

errText="错误的标识符.";

break;

case 3:

errText="运算符\'&&\'(\'||\')写成\'&\'(\'|\')了.";

break;

case 4:

errText="语法错误,编译停止!";

break;

case 5:

errText="找不到main()函数.";

break;

case 6:

errText="所使用的函数未定义";

break;

case 7:

errText="语句后缺少\';\'.";

break;

case 8:

errText="else没有与之匹配的if.";

break;

case 9:

errText="缺少语句.";

break;

case 10:

errText="变量未定义.";

break;

case 11:

errText="变量以定义过,不能重新定义.";

break;

default:

errText="未知错误!";

}

log<<"发生错误:文件"<<fileName<<".crr第"<<line<<"行:"<<errText<<endl;

}

int Compiler::lookup(string m)

{

list<string>::iterator i;

for (i = symbolList.begin(); i != symbolList.end(); ++i)

if(*i==m)

return 1;

return 0;

}

Symbol::Symbol()

{

}

Symbol::Symbol(const Symbol &b)

{

group=b.group;

line=b.line;

word=b.word;

}

Symbol::~Symbol()

{

}

Symbol::operator =(const Symbol &b)

{

group=b.group;

line=b.line;

word=b.word;

}

Label::Label()

{

n=next();

char buffer[6];

text=_itoa(n,buffer,10);

text="L"+text;

}

Label::~Label()

{

}

int Label::next()

{

return ++_label;

}

int Label::_label=0;

Action::Action()

{

}

Action::~Action()

{

}

int Action::lookUp(char v,int s)

{

int n=vs.find_first_of(v,0);

return Table[s-1][n];

}

string Action::vs ="+*>&=!@n(){};,ziew$";

int Action::Table[54][19]={

-40,-40,-40,-40,-40,-40,3,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state1

-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,0,//state2

-40,-40,-40,-40,-40,-40,-40,-40,4,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state3

-40,-40,-40,-40,-40,-40,-40,-40,-40,5,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state4

-40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,-40,-40,-40,11,9,-30,10,-40,//state5

-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-1,//state6

-40,-40,-40,-40,12,-40,-40,-40,13,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state7

-40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,-32,-32,-40,11,9,-30,10,-32,//state8

-40,-40,-40,-40,-40,-40,-40,-40,13,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state9

-40,-40,-40,-40,-40,-40,-40,-40,13,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state10

-40,-40,-40,-40,-40,-40,17,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state11

-40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state12

-40,-40,-40,-40,-40,27,22,23,28,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state13

-40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,29,-40,-40,11,9,-30,10,-40,//state14

-40,-40,-40,-40,-40,-40,-10,-40,-40,-40,-10,-10,-40,-40,-10,-10,-30,-10,-40,//state15

-40,-40,-40,-40,-40,-40,-31,-40,-40,-40,-31,-31,31,32,-31,-31,-30,-31,-31,//state16

-40,-40,-40,-40,-40,-40,-31,-40,-40,-40,-31,-31,-11,-11,-31,-31,-30,-31,-31,//state17

35,-40,-40,-40,-40,-40,-31,-40,-40,34,-31,-31,33,-40,-31,-31,-30,-31,-31,//state18

-19,36,-19,-19,-40,-40,-31,-40,-40,-19,-31,-31,-19,-40,-31,-31,-30,-31,-31,//state19

-21,-21,-21,-21,-40,-40,-31,-40,-40,-21,-31,-31,-21,-40,-31,-31,-30,-31,-31,//state20

-40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state21

-23,-23,-23,-23,-40,-40,-31,-40,-40,-23,-31,-31,-23,-40,-31,-31,-30,-31,-31,//state22

-24,-24,-24,-24,-40,-40,-31,-40,-40,-24,-31,-31,-24,-40,-31,-31,-30,-31,-31,//state23

-40,-40,-40,38,-40,-40,-40,-40,-40,34,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state24

35,-40,39,-40,-40,-40,-31,-40,-40,34,-31,-31,33,-40,-31,-31,-30,-31,-31,//state25

-40,-40,-40,-14,-40,-40,-40,-40,-40,-14,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state26

-40,-40,-40,-40,-40,27,22,23,28,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state27

-40,-40,-40,-40,-40,27,22,23,28,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state28

-40,-40,-40,-40,-40,-40,-3,-40,-40,-40,-3,-3,-40,-40,-3,-3,-3,-3,-3,//state29

-40,-40,-40,-40,-40,-40,-9,-40,-40,-40,-9,-9,-40,-40,-9,-9,-9,-9,-40,//state30

-40,-40,-40,-40,-40,-40,-7,-40,-40,-40,-7,-7,-40,-40,-7,-7,-7,-7,-7,//state31

-40,-40,-40,-40,-40,-40,44,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state32

-40,-40,-40,-40,-40,-40,-2,-40,-40,-40,-2,-2,-40,-40,-2,-2,-2,-2,-2,//state33

-40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,-32,46,-40,11,9,-30,10,-32,//state34

-40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state35

-40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state36

35,-40,-40,-40,-40,-40,-40,-40,-40,49,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state37

-40,-40,-40,-40,-40,27,22,23,28,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state38

-40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state39

-40,-40,-40,-16,-40,-40,-40,-40,-40,-16,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state40

35,-40,39,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state41

-40,-40,-40,38,-40,-40,-40,-40,-40,52,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state42

35,-40,39,-40,-40,-40,-31,-40,-40,49,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state43

-40,-40,-40,-40,-40,-40,-31,-40,-40,-40,-31,-31,-12,-12,-31,-31,-30,-31,-31,//state44

-40,-40,-40,-40,-40,-40,-4,-40,-40,-40,-4,-4,-40,-40,-4,-4,53,-4,-4,//state45

-40,-40,-40,-40,-40,-40,-8,-40,-40,-40,-8,-8,-40,-40,-8,-8,-30,-8,-8,//state46

-18,36,-18,-18,-40,-40,-31,-40,-40,-18,-31,-31,-18,-40,-31,-31,-30,-31,-31,//state47

-20,-20,-20,-20,-40,-40,-31,-40,-40,-20,-31,-31,-20,-40,-31,-31,-30,-31,-31,//state48

-22,-22,-22,-22,-40,-40,-31,-40,-40,-22,-31,-31,-22,-40,-31,-31,-30,-31,-31,//state49

-40,-40,-40,-13,-40,-40,-40,-40,-40,-13,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state50

35,-40,-40,-15,-40,-40,-40,-40,-40,-15,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state51

-40,-40,-40,-17,-40,-40,-40,-40,-40,-17,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state52

-40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,-32,-32,-40,11,9,-30,10,-32,//state53

-40,-40,-40,-40,-40,-40,-5,-40,-40,-40,-5,-5,-40,-40,-5,-5,-30,-5,-5};//state54

Goto::Goto()

{

}

Goto::~Goto()

{

}

int Goto::lookUp(char v,int s)

{

int n=vs.find_first_of(v,0);

return Table[s-1][n];

}

string Goto::vs="DSWLGMETF";

int Goto::Table[54][9]={

2,0,0,0,0,0,0,0,0,//state1

0,0,0,0,0,0,0,0,0,//state2

0,0,0,0,0,0,0,0,0,//state3

0,0,0,0,0,0,0,0,0,//state4

0,6,0,0,0,0,0,0,0,//state5

0,0,0,0,0,0,0,0,0,//state6

0,0,0,0,0,0,0,0,0,//state7

0,15,14,0,0,0,0,0,0,//state8

0,0,0,0,0,0,0,0,0,//state9

0,0,0,0,0,0,0,0,0,//state10

0,0,0,16,0,0,0,0,0,//state11

0,0,0,0,0,0,18,19,20,//state12

0,0,0,0,24,26,25,19,20,//state13

0,30,0,0,0,0,0,0,0,//state14

0,0,0,0,0,0,0,0,0,//state15

0,0,0,0,0,0,0,0,0,//state16

0,0,0,0,0,0,0,0,0,//state17

0,0,0,0,0,0,0,0,0,//state18

0,0,0,0,0,0,0,0,0,//state19

0,0,0,0,0,0,0,0,0,//state20

0,0,0,0,0,0,37,19,20,//state21

0,0,0,0,0,0,0,0,0,//state22

0,0,0,0,0,0,0,0,0,//state23

0,0,0,0,0,0,0,0,0,//state24

0,0,0,0,0,0,0,0,0,//state25

0,0,0,0,0,0,0,0,0,//state26

0,0,0,0,0,40,41,19,20,//state27

0,0,0,0,42,26,43,19,20,//state28

0,0,0,0,0,0,0,0,0,//state29

0,0,0,0,0,0,0,0,0,//state30

0,0,0,0,0,0,0,0,0,//state31

0,0,0,0,0,0,0,0,0,//state32

0,0,0,0,0,0,0,0,0,//state33

0,45,0,0,0,0,0,0,0,//state34

0,0,0,0,0,0,0,47,20,//state35

0,0,0,0,0,0,0,0,48,//state36

0,0,0,0,0,0,0,0,0,//state37

0,0,0,0,0,50,41,19,20,//state38

0,0,0,0,0,0,51,19,20,//state39

0,0,0,0,0,0,0,0,0,//state40

0,0,0,0,0,0,0,0,0,//state41

0,0,0,0,0,0,0,0,0,//state42

0,0,0,0,0,0,0,0,0,//state43

0,0,0,0,0,0,0,0,0,//state44

0,0,0,0,0,0,0,0,0,//state45

0,0,0,0,0,0,0,0,0,//state46

0,0,0,0,0,0,0,0,0,//state47

0,0,0,0,0,0,0,0,0,//state48

0,0,0,0,0,0,0,0,0,//state49

0,0,0,0,0,0,0,0,0,//state50

0,0,0,0,0,0,0,0,0,//state51

0,0,0,0,0,0,0,0,0,//state52

0,54,0,0,0,0,0,0,0,//state53

0,0,0,0,0,0,0,0,0//state54

};

Compiler::optimize()

{

int i,j,f;

string t="\tpush ax\n\tpop ax\n";

do{

f=0;

j=code.length()-17;

for(i=0;i<j;i++){

if(code.substr(i,17)==t){

f=1;

code.replace(i,17,"");

break;

}

}

}while(f);

}

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

string file(lpCmdLine);

file=file.substr(0,file.find_last_of('.'));

if(!file.empty()){

Compiler cc(file);

cc.preProcess();

cc.parser();

cc.emitter();

ofstream bat;

bat.open((file+".bat").c_str(),ios::out);

bat<<"masm "<<file<<".asm"<<endl;

bat<<"link "<<file<<".obj"<<endl;

bat.close();

}

return 0;

}

文法:

1: D->@()S. 程序->主函数

2: S->@=E;. 赋值语句

3: S->{W}. 组合语句

4: S->i(G)S. if语句

5: S->i(G)SeS. if-else语句

6: S->w(G)S. while语句

7: S->zL;. 变量定义

8: S->@(E);. 函数调用

9: W->WS. 多条语句列表

10: W->S. 语句列表

11: L->@. 变量名列表

12: L->L,@. 多个变量名列表

13: G->G&M. 逻辑表达式

14: G->M.

15: M->E>E. 关系表达式

16: M->!M. 逻辑非表达式

17: M->(G). 带括号的逻辑表达式

18: E->E+T. 加法表达式

19: E->T.

20: T->T*F. 乘法表达式

21: T->F.

22: F->(E). 带括号的算术表达式

23: F->@. 变量表达式

24: F->n. 数字表达式

示例代码

#import system.out

main()

{

int i;

int s1,s2,s3;

i=100;

while(i<1000){

s1=i/100;

s2=i/10%10;

s3=i%10;

if(s1<s2&&s2>s3)

out(i);

i=i+1;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有