Skip to content

gjc2/PL0-compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PL0 编译器

语法分析 中间代码生成 目标代码生成 finish!

以后可以把词法分析放进来,变成一个完整的编译器,现在不想加了

(一开始写的时候没意识到写成一个程序)

yffx.cpp 主函数

只有语法分析的文档,目标代码生成没写

语法分析

错误检查应该被补充

rule类 规则

读取一个规则,转化成规则(eg.A->B: A->.B & A->B.)

item类 项

自动机的每一个状态

DFA

LR(0) 分析表

中间代码生成?还要加静态语义检查

每个规则增加属性

语法有问题

const a=10与=又是关系运算符 所以改关系运算符=为==,与c风格相同

A:<程序>

B:<分程序>

C :<常量说明部分>

D :<变量说明部分>

E :<过程说明部分>

F :[<常量说明部分>]

0 :{,<常量定义>} //数字0

G :<常量定义>

1 :{,<标识符>} //数字1

I :[<变量说明部分>]

J :{<过程说明部分>}

K :[<过程说明部分>]

L :<过程首部>

2 :{;<语句>} //数字2

M :<语句>

N :<赋值语句>

O :<条件语句>

P :<当型循环语句>

Q :<过程调用语句>

R :<读语句>

S :<写语句>

T :<复合语句>

U :{<加减运算符><项>}

V :<表达式>

W :<条件>

X :{<乘除运算符><因子>}

Y :<项>

Z :<因子>

3 :[q]

a: const 关键字

b: var 关键字

c: procedure 关键字

d: := 关键字(看做关键字吧,词法分析改一下)

e: begin 关键字

f: end 关键字

g: odd 关键字

h: if 关键字

i: then 关键字

j: call 关键字

k: while

l: do

m: read

n: write

o: <无符号整数>

p: <标识符>

q: <加减运算符>

r: <乘除运算符>

s: <关系运算符>

5,7可以不考虑,词法分析已经读出

17,18,19也是

25,26也用不上

属性文法

code 综合属性,表示代码

value 综合属性,表示值

place 综合属性, 表示符号的名字

sym 综合属性, 表示运算符号,如*/+-

1.<程序> -> <分程序>。//A.code=B.code

A->B。

2.<分程序> -> [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>

B->FIKH		//B.code=F.code+I.code+K.code+M.code 几个代码段拼起来

			//gen(j,-,-,0);

F->C		//F.code=C.code

F->NULL		//F.code=NULL

I->D		//I.code=D.code

I->NULL		//I.code=NULL

K->E		//K.code=E.code

K->NULL		//K.code=NULL

常量说明部分:

3.<常量说明部分> -> const<常量定义>{,<常量定义>};

C->aG0;		//table.insert(name: G.name,kind: constant,val:G.value,addr: )

0->,G0		//table.insert(name: G.name,kind: constant,val:G.value,addr: )

0->NULL

4.<常量定义> -> <标识符>=<无符号整数>

G->p=o		//table.insert(name:p,kind:constant,val:o.value,addr: )

//5.<无符号整数> -> <数字>{<数字>}

// //I->JJ'

// //J'=JJ'

// //J'=NULL

变量说明部分:

6.<变量说明部分>->var<标识符>{,<标识符>};

D->bp1;		//table.insert(name: p.name,kind: variable,level:l,addr: d)

				d=d+var.width

1->,p1		//table.insert(name: p.name,kind: variable,level:l,addr: d)

				d=d+var.width

1->NULL

//7.<标识符> -> <字母>{<字母>|<数字>}

// //H->KK'

// //K'->JK'

// //K'->KK'

// //K'->NULL

过程说明部分:

8.<过程说明部分> -> <过程首部><分程序>;{<过程说明部分>}

E->LB;J

J->EJ

J->NULL

9.<过程首部>->procedure<标识符>;

L->cp;		//l=l+1

			//gen(j,-,-,0)

语句

H->4M

4->NULL

10.<语句> -> <赋值语句>|<条件语句>|<当型循环语句>

|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空>

M->N		//M.start=,M.end=

M->O

M->P

M->Q

M->R

M->S

M->T

M->NULL

11.<赋值语句>-><标识符>:=<表达式>

N->pdV		//find=look(p.name)

			//if find!=NULL then gen(=,V.place,-,p);

12.<复合语句>->begin<语句>{;<语句>}end

T->eM2f		//T.start=M.start;T.end=2.end

2->;M2		//2.start=M.start;2.end=2.end

2->NULL		//2.end,2.start=nxq;

13.<条件> -> <表达式><关系运算符><表达式>|odd<表达式>

5->6W

6->NULL

W->VsV		//W.truelist=mklist(nxq);

			//W.falselist=mklist(nxq+1);

			//gen(s.place,V.place,V.place,0);

			//gen(j,-,-,0);

W->gV		//W.truelist=mklist(nxq);

			//W.falselist=mklist(nxq+1);

			//gen(g.place,V.place,1,0);

			//gen(j,-,-,0);

14.<表达式>->[<加减运算符>]<项>{<加减运算符><项>}

V->3YU		//V1.place=newtemp;gen(3.place,Y.place,-,V1.place);

			//V.place=newtemp;gen(+,V1.place,U.place,V.place);

3->q		//3.place=q.place;

3->NULL		//3.place='+';

U->qYU		//U1.place=newtemp;gen(q.place,Y.place,-,U1.place);

			//U.place=newtemp;gen(+,U1.place,U右.place,U左.palce)

U->NULL		//U.place=0

15.<项>-><因子>{<乘除运算符><因子>}

Y->ZX		//Y.place=newtemp;gen(X.sym,Z,place,X.place,Y.place);

X->rZX		//X.sym=r.sym;X.place=newtemp;gen(X右.sym,X右.place,Z.place,X.place);

X->NULL		//X.sym=+,X.place=0;

16.<因子>-><标识符>|<无符号整数>|(<表达式>)

Z->p		//Z.place=p.place

Z->o		//Z.place=o.place

Z->(V)		//Z.place=V.place

//17.<加减运算符>->+|-

// //Z->+|-

//18.<乘除运算符>->*|/

// //F->*|/

//19.<关系运算符>->==|#|<|<=|>|>=

// //X->=|#|<|<=|>|>= //原来是=,会有冲突

20.<条件语句>-> if<条件>then<语句>

O->hWiM		//backpatch(W.truelist,M.start);

			//backpathc(W.falselist,M.end);

			//O.start=M.start

			//O.end=M.end

21.<过程调用语句>->call<标识符>

Q->jp		//Q.start=nxq;

			//Q.place=newtemp(j.place,p.place,-,-);

			//Q.end=nxq;

22.<当型循环语句>->while<条件>do<语句>

P->kWlM		//backpatch(W.truelist,M.start)

			//backpatch(W.falselist.M.end)

			//gen(j,-,-,M.start)

			//P.start=M.start

			//P.end=nxq;

23.<读语句>->read(<标识符>{,<标识符>})

R->m(p1)	//R.start=nxq

			//gen(m.place,p.place,1.place,-);

			//R.end=nxq;

24.<写语句>->write(<标识符>{,<标识符>})

S->n(p1)	//S.start=nxq

			//gen(n.place,p.place,1.place,-);

			//R.end=nxq;

//25.<字母>->a|...|z

// //K->a|...|z

//26.<数字>->0|...|9

// //J->0|...|1

语法:

x.push_back(new rule("&", "A。"));

x.push_back(new rule("A", "B"));

x.push_back(new rule("B", "FIKM"));

x.push_back(new rule("F", "C"));

x.push_back(new rule("F", "@"));

x.push_back(new rule("I", "D"));

x.push_back(new rule("I", "@"));

x.push_back(new rule("K", "E"));

x.push_back(new rule("K", "@"));

x.push_back(new rule("C", "aG0;"));

x.push_back(new rule("0", ",G0"));

x.push_back(new rule("0", "@"));

x.push_back(new rule("G", "p=o"));

x.push_back(new rule("D", "bp1;"));

x.push_back(new rule("1", ",p1"));

x.push_back(new rule("1", "@"));

x.push_back(new rule("E", "LB;J"));

x.push_back(new rule("J", "EJ"));

x.push_back(new rule("J", "@"));

x.push_back(new rule("L", "cp;"));

x.push_back(new rule("M", "N"));

x.push_back(new rule("M", "O"));

x.push_back(new rule("M", "P"));

x.push_back(new rule("M", "Q"));

x.push_back(new rule("M", "R"));

x.push_back(new rule("M", "S"));

x.push_back(new rule("M", "T"));

x.push_back(new rule("M", "@"));

x.push_back(new rule("N", "pdV"));

x.push_back(new rule("T", "eM2f"));

x.push_back(new rule("2", ";M2"));

x.push_back(new rule("2", "@"));

x.push_back(new rule("W", "VsV"));

x.push_back(new rule("W", "gV"));

x.push_back(new rule("V", "3YU"));

x.push_back(new rule("3", "q"));

x.push_back(new rule("3", "@"));

x.push_back(new rule("U", "qYU"));

x.push_back(new rule("U", "@"));

x.push_back(new rule("Y", "ZX"));

x.push_back(new rule("X", "rZX"));

x.push_back(new rule("X", "@"));

x.push_back(new rule("Z", "p"));

x.push_back(new rule("Z", "o"));

x.push_back(new rule("Z", "(V)"));

x.push_back(new rule("O", "hWiM"));

x.push_back(new rule("Q", "jp"));

x.push_back(new rule("P", "kWlM"));

x.push_back(new rule("R", "m(p1)"));

x.push_back(new rule("S", "n(p1)"));

About

PL0 语言编译器

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages