PL0的扩充与修改
2023-05-27 17:14:35 2 举报
AI智能生成
PL0
作者其他创作
大纲/内容
编译程序
将高级语言翻译成汇编语言或机器语言的程序
程序保存时是按照字符保存ASCII码的
词法分析
从左到右扫描源程序,确定单词类型,将识别的单词转换为token
token:<种编码,属性值>
种编码本质是int类型
EBNF 元符号含义
<>
用尖括号括起来的中文字表示语法构造成分,或称语法单元;而用尖括号括起来的英文字表示一类词法单元。
::=
表示左部的语法单位由右部定义,可读作“定义为”。
|
表示“或”,即多选项。
{}
用花括号括起来的成分可以重复0次到任意多次。
[]
用方括号括起来的成分为任选项,即出现一次或不出现。
语法单位组成
<程序> ::= <分程序>
<分程序> ::= [<常量说明部分>;][<变量说明部分>;]
{<过程说明部分>;}<语句部分>
{<过程说明部分>;}<语句部分>
<常量说明部分> ::= const<常量定义>{,<常量定义>}
<常量定义> ::= <标识符>=<无符号整数>
<无符号整数> ::= <数字>{<数字>}
<变量说明部分> ::= var<标识符 >{,<标识符>}
<标识符> ::= <字母>{<字母>|<数字>}
<过程说明部分> ::= <过程首部><分程序>
<过程首部> ::= procedure<标识符>
<语句部分> ::= <语句>|<复合语句>
<复合语句> ::= BEGIN<语句>{;<语句>}END
<语句> ::= <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|
<读语句>|<写语句>|<复合语句>|<空语句>
<读语句>|<写语句>|<复合语句>|<空语句>
<赋值语句> ::= <标识符>:=<表达式>
<条件> ::= <表达式><关系运算符><表达式>|ODD<表达式>
<表达式> ::= [+|-]<项>{<表达式><加法运算符><项>}
<项> ::= <因子>|<项><乘法运算符><因子>
<因子> ::= <标识符>|<常量>|(<表达式>)
<常量> ::= <无符号整数>
<加法运算符> ::= + | -
<乘法运算符> ::= * | /
<关系运算符> ::= <|>|<|>=|<=|=
<条件语句> ::= if<条件>then<语句>
<过程调用语句> ::= call<标识符>
<当型循环语句> ::= while<条件>do<语句>
<读语句> ::= read(<标识符>{,<标识符>})
<写语句> ::= write(<表达式>{,<表达式>})
<字母> ::= a|b|c···|z
<数字> ::= 0|1|2···|9
PL/0语言
pascal语言的子集,比较简单
语句类型
顺序:begin...end...
条件:if then else
重复:while do
数据类型
只有整形
声明类型
函数部分
词法分析函数
GetCh()
忽略空格,读取一个字符
GetSym()
词法分析
处理判断函数
TEST(SYMSET S1, SYMSET S2, int N)
测试当前单词符号是否合法
ConstDeclaration(int LEV,int &TX,int &DX)
常量定义处理
VarDeclaration(int LEV,int &TX,int &DX)
变量说明处理
FACTOR(SYMSET FSYS, int LEV, int &TX)
因子处理
TERM(SYMSET FSYS, int LEV, int &TX)
项处理
EXPRESSION(SYMSET FSYS, int LEV, int &TX)
表达式处理
<表达式> ::= [+|-]<项>{<表达式><加法运算符><项>}
这个[+|-]是为了防止++i和--i作为表达式的情况,所以会先调用判断
CONDITION(SYMSET FSYS, int LEV, int &TX)
条件处理
<条件> ::= <表达式><关系运算符><表达式>|ODD<表达式>
STATEMENT(SYMSET FSYS, int LEV, int &TX)
语句处理
其它函数
Error(int n)
出错处理,打印出错位置和错误编码
GEN(FCT X, int Y, int Z)
生成目标代码,并送入目标程序区
Enter(OBJECTS K, int LEV, int &TX, int &DX)
登录名字表
Position(ALFA ID, int TX)
查找标识符在名字表中的位置
ListCode(int CX0)
列出目标代码清单
Block(int LEV, int TX, SYMSET FSYS)
分程序分析处理过程
BASE(int L,int B,int S[])
通过静态链求出数据区的基地址
Interpret()
对目标代码的解析执行程序
系统函数
SymSetNew
创建新的符号集,将参数位置设置为1
SymSetUnion
将前后两个符号集合并,确定本次的符号内容
SymIn(SYMBOL SYM, SYMSET S1)
查找SYM信号是否在信号集中
关键字部分
汇编关键字
LIT 0 A
LOAD CONSTANT A
OPR 0 A
EXECUTE OPR A
LOD L A
LOAD VARIABLE L,A
STO L A
STORE VARIABLE L,A
CAL L A
CALL PROCEDURE A AT LEVEL L
INI 0 A
INCREMET T-REGISTER BY A
JMP 0 A
JUMP TO A
JPC 0 A
JUMP CONDITIONAL TO A
部分程序关键字
基础关键字
NUL
NULL
IDENT
变量
NUMBER
数字
CONDITION函数符号关键字
EQL
相等
NEQ
不相等
LSS
小于
LEQ
小于等于
GTR
大于
GEQ
大于等于
EXPRESSION函数符号关键字
PLUS
加法
MINUS
减法
参数部分
CX:保存记录指令个数,便于输出
CODE结构体
保存指令
数组部分
各类信号set
FACBEGSYS
有三位是1,包括NUMBER、IDENT、LPAREN(左括号)
基本用来判断运算符左边开头是否合法
STATBEGSYS
有五位是1,包括BEGINSYM、CALLSYM、IFSYM、WHILESYM、WRITESYM
单词识别
关键字
标识符
整数
运算符、界符
忽略注释
0 条评论
下一页