Mini Java编译器(三)

编译

三、属性翻译文法
主类声明(MainClass)
<MainClass> ::= "class" <Identifier>↑<id_name1>

@fillMemory↓<id_name1>↑<id_address>

@fillTable↓<id_name1>,<id_address>

@fillTree↓<id_name1>

"{" "public" "static" "void" "main" "(" "String" "[" "]"

<Identifier>↑<id_name2>,<id_belongsTo>=<id_name1>,<id_type>=StringArrayType

@fillTable↓<id_name2>,<id_belongsTo>

"{" <PrintStatement> "}" "}"

类声明(ClassDeclaration)
<ClassDeclaration> ::= "class" <Identifier>↑<id_name>

@checkTable↓<id_name>

@fillMemory↓<id_name1>↑<id_address>

@fillTable↓<id_name>,<id_address>

@fillTree↓<node_name>=<id_name>

"{" ( VarDeclaration )* ( MethodDeclaration )* "}"

类继承声明(ClassExtendsDeclaration)
<ClassExtendsDeclaration> ::= "class" <Identifier>↑<id_name1>

@checkTable↓<id_name1>

"extends" <Identifier>↑<id_name2>

@checkTree↓<id_name2>

@fillMemory↓<id_name1>↑<id_address>

@fillTable↓<id_name1>,<id_name2>,<id_address>

@fillTree↓<child_name>=<id_name1>,<parent_name>=<id_name2>

"{" ( VarDeclaration )* ( MethodDeclaration )* "}"

变量声明(VarDeclaration)
<VarDeclaration> ::= <Type>↑<id_type>

<Idetifier>↑<id_name>,<id_belongsTo> “;”

@checkTable↓<id_name>,<id_belongsTo>

@fillMemory↓<id_name>↑<id_address>

@fillTable↓<id_name>,<id_type>,<id_belongsTo>,<address>

<Type>↑<id_type> ::= <ArrayType>↑<id_type>=ArrayType

|<BooleanType>↑<id_type>=BooleanType

|<IntegerType>↑<id_type>=IntegerType

<VarDeclaration> ::= <Type>↑<id_type>=ObjectType

@checkTable↓<id_type>

<Idetifier>↑<id_name>,<id_belongsTo> “;”

@checkTable↓<id_name>,<id_belongsTo>

@fillTable↓<id_name>,<id_type>,<id_belongsTo>

方法声明(MethodDeclaration)
<MethodDeclaration> ::= "public" <Type>↑<id_type>

<Identifier>↑<id_name>,<id_belongsTo>

@checkTable↓<id_name>,<id_belongsTo>

@fillMemory↓<id_name>↑<id_address>

@fillTable↓<id_name>,<id_type>,<id_belongsTo>,<id_address>

"(" ( <FormalParameterList> )? ")"

"{" ( <VarDeclaration> )* ( <Statement> )* "return"

<Expression>↑<exp_type>,<exp_value>

@checkType↓<id_type>,<exp_type> ";" "}"

<Type>↑<id_type> ::= <ArrayType>↑<id_type>=ArrayType

|<BooleanType>↑<id_type>=BooleanType

|<IntegerType>↑<id_type>=IntegerType

<FormalParameterList> ::= <FormalParameter>

( <FormalParameterRest> )*

<FormalParameter> ::= <Type>↑<id_type>

<Identifier>↑<id_name>,<id_belongsTo>

@checkTable↓<id_name>,<id_belongsTo>

@fillTable↓<id_name>,<id_type>

<MethodDeclaration> ::= "public" <Type>↑<id_type>=ObjectType

@checkTable↓<id_type>

<Identifier>↑<id_name>,<id_belongsTo>

@checkTable↓<id_name>,<id_belongsTo>

@fillMemory↓<id_name>↑<id_address>

@fillTable↓<id_name>,<id_type>,<id_belongsTo>,<id_address>

"(" ( <FormalParameterList> )? ")"

"{" ( <VarDeclaration> )* ( <Statement> )* "return"

<Expression>↑<exp_type>,<exp_value>

@checkType↓<id_type>,<exp_type> ";" "}"

<Type>↑<id_type> ::= <ArrayType>↑<id_type>=ArrayType

|<BooleanType>↑<id_type>=BooleanType

|<IntegerType>↑<id_type>=IntegerType

<FormalParameterList> ::= <FormalParameter>

( <FormalParameterRest> )*

<FormalParameter> ::= <Type>↑<id_type>=ObjectType

@checkTable↓<id_type>

<Identifier>↑<id_name>,<id_belongsTo>

@checkTable↓<id_name>,<id_belongsTo>

@fillMemory↓<id_name>↑<id_address>

@fillTable↓<id_name>,<id_type>,<id_address>

<FormalParameterRest> ::= "," <FormalParameter>

赋值语句(AssignmentStatement)
<AssignmentStatement> ::= <Identifier>↑id_name @checkTable↓<id_name>↑<id_type>

“=” <Expression>↑<exp_type>,<exp_value> “;”

@checkType↓<id_type>,<exp_type>

@generateCode↓<stmt_type>=stmt_assign,<extra_para>

数组元素赋值语句(ArrayAssignmentStatement)
<ArrayAssignmentStatement> ::= <Identifier>↑<id_name> @checkTable↓<id_name>↑<id_type>

@checkType↓<id_type>,ArrayType

"[" <Expression>↑<exp_type1>,<exp_value1>

@checkType↓<exp_type1>,IntegerType

"]" "=" <Expression>↑<exp_type2>,<exp_value2>

@checkType↓<exp_type2>,IntegerType ";"

@generateCode↓<stmt_type>=stmt_array_assign,<extra_para>

if语句(IfStatement)
<IfStatement> := "if" "(" <Expression>↑<exp_type>,<exp_value>

@checkType↓<exp_type>,BooleanType

")" <Statement> "else" <Statement>

@generateCode↓<stmt_type>=stmt_if,<extra_para>

while语句(WhileStatemen)
<WhileStatement> ::= "while" "(" <Expression>↑<exp_type>,<exp_value>

@checkType↓<exp_type>,BooleanType

")" <Statement>

@generateCode↓<stmt_type>=stmt_while,<extra_para>

打印语句(PrintStatement)
<PrintStatement> ::= "System.out.println" "("

<Expression>↑<exp_type>,<exp_value>

@checkType↓<exp_type>,IntegerType

")" ";"

@generateCode↓<stmt_type>=stmt_print,<extra_para>

属性及动作解释
动作
动作

作用

@checkTable↓<id_name>,<id_level>

检查标识符的合法性(遍历符号表)

@checkTable↓<class_name>

检查类名是否已声明

@checkTable↓<id_name>↑<id_type>

检查变量是否已声明,若已声明返回变量类型

@checkTable↓<id_type>

检查类型是否已声明

@fillTable↓<id_name1>,<id_address>

将标识符插入符号表

@fillTable↓<child_name>,<parent_name>,<id_address>

将子类插入符号表,同时复制父类的方法和类变量至子类

@fillTable↓<id_name>,<id_belongsTo>

将标识符插入符号表

@fillTable↓<id_name>,<id_sort>,<id_level>,<id_type>

将标识符插入符号表

@fillMemory↓<id_name>↑<id_address>

登记内存,返回地址

@generateCode↓<stmt_type>,<extra_para>

生成伪代码

@checkType↓<child_name>,<parent_name>

检查类型合法性(遍历继承树、符号表)

@checkType↓<id_type>,<exp_type>

检查变量类型与表达式类型是否匹配

@checkTree↓<child_name>,<parent_name>

检查child_name是否是parent_name的子类(遍历继承树)

@checkTree↓<class_name>

检查child_name是否已存在于继承树内

@fillTree↓<child_name>,<parent_name>

将child_name插入继承树中parent_name下

@fillTree↓<node_name>

将node_name插入继承树中(父类为Object)

属性
属性

数据类型(针对Java语言)

含义

id_name

String
标识符名称

id_level

int
标识符的层次结构

id_belongsTo

String
所属层次名称,(见附表)

id_address

int
内存地址

stmt_type

int
操作类型(见附表)

class_name

String
类名

extra_para

Object
附加参数

child_name

String
子类名称

parent_name

String
父类名称

class_name

String
类名

id_type

compiler.type.Type
变量类型类型(见附表)

para_list

java.util.List
参数表

exp_value

int或boolean或任何程序中已定义的对象类型
表达式值

exp_type

compiler.type.Type
表达式类型

符号表结构
名称

数据类型(针对Java语言)

含义

name

String
标识符名称

sort

String
标识符类别

type

compiler.type.Type
变量类型

belongsTo

String
归属信息(见附表)

address

int
存储地址

内存分配表结构
名称

数据类型(针对Java语言)

含义

address

int
标识符地址

sort

String
标识符类别

name

String
标识符名称

value

Object
标识符值

附表
stmt_type
名称

含义

stmt_assign

1
赋值语句

stmt_array_assign

2
数组元素赋值语句

stmt_if

3
if语句

stmt_while

4
while语句

stmt_print

5
打印语句

id_type

含义

size(字长(bytes))

ArrayType

整型数组类型
4

BooleanType

布尔类型
1

IntegerType

整型类型
4

ObjectType

对象类型
不确定

NonVariableType

非变量
0

id_belongsTo
标识符类型

“belongsTo”属性内容


无(分析时以文件为单位)

方法
类名

类变量
类名

方法内变量
方法名

参数
方法名

时间: 2024-08-18 04:17:48

Mini Java编译器(三)的相关文章

Mini Java编译器(五)

编译 六.系统的设计和实现这个编译器是用Java写的,基于OO技术,所以整个系统是尽量用OOD设计的.OOD中最小的设计粒度是类,本系统的大致类结构如下   compiler包整个系统的根,UML图如下:   token包封装了所有的可识别单词,采用一符一码,单词对应的码定义在Token类中,该类是抽象类,仅作继承用.该包UML图如下: common包公用包,封装了一些公用的对象和数据结构: HierarchyTree类和HierarchyTreeNode类定义了继承树结构: MemoryTab

Mini Java编译器(一)

编译 一.任务概述本项大作业将设计并实现一个Mini Java语言的编译器 Mini Java概述Mini Java是Java语言的子集.作为一种很好的编译课程教学语言,它与Java相比做了如下精简: (1)不允许重载(overloading) (2)一个文件中可以申明若干个类,但必须有且只有一个的主类,辅类可以有多个,类不能申明为public:主类中只能有一个主方法,该方法的签名必须为"public static void main(String[])",其中String[]参数不做

Mini Java编译器(二)

编译 二.Mini Java的文法BNFGoal ::= MainClass ( TypeDeclaration )* <EOF> MainClass ::= "class" Identifier "{" "public" "static" "void" "main" "(" "String" "[" "]

Mini Java编译器(四)

编译 四.P代码指令说明由于系统较简单,所以对底层硬件也做了简化: 1.没有寄存器,只有一个数据栈 2.只能对主存进行存.取操作 3.只支持主存间接寻址 4.可以查找符号表中符号,返回该符号地址   指令表(未完成)助记符 格式 说明 push push <address> 将<address>指向的内容压栈 pop pop <address> 将栈顶内容弹入<address>指向的位置 jmp jmp <address> 无条件跳转至<a

Mini Java编译器(六)

编译 七.系统工作过程及运行说明             八.实例程序运行结果示例一代码class Main{   public static void main(String[] args){     System.out.println(10);   } }             class G{   public int get(int num){     int a;     a=2;     return a+5;   } }             class H extends

JVM深入学习笔记一:Java 编译器初探

闲来无事想大概看下Java编译器的执行过程 一. 编译一个文件 首先去搞到源代码.从JDK6开始Java代码开源,放到OPENJDK组织中去,所以从这个网站进行下载: http://hg.openjdk.java.net/jdk6/jdk6/langtools/  下载之后是一个zip包,解压,可以直接导入到eclipse中进行使用,导入之后可能会报错,需要设置一下. 好,下面写一个用作测试的类: import java.util.Arrays; import java.util.List; i

java 开发-java 编译器 如何打开源代码例程

问题描述 java 编译器 如何打开源代码例程 想学习一下java开发!用什么编译器,如何生成并运行程序?从csdn上下载的源代码例程,如何打开并重新生成可执行代码? 解决方案 需要先安装jdk,内含jre,可以从oracle官网下载. 有了jdk,就可以编译java程序,有了jre,就可以运行java程序,不过都只能通过命令行. 所以然后下载eclipse.netbeans或者jcreator这三个软件之一,这样就有开发环境了,方便你调试.编辑程序. 解决方案二: 下个eclipse吧 解决方

java编译器顺序-java读取代码顺序是从左往右还是从右往左

问题描述 java读取代码顺序是从左往右还是从右往左 java编译器读取每行代码顺序是从左往右还是从右往左 例如 int a=1; int b=2; int c=3; int d=a+b*c int d=a+b*c是从左往右读取还是按优先级读取 编译器读取每行代码都是从左往右读取吗 解决方案 也许你觉得从左到右是很天经地义的事情. 偏偏阿拉伯文就是从右到左的. 我们知道,windows.office这些软件都有阿拉伯语言的版本,也能正确处理这些语言. 那么微软是否需要为这些国家或者地区的人重新设

java同行打印输出-Java编译器为什么不能同行输出了呀

问题描述 Java编译器为什么不能同行输出了呀 Java编译器为什么同行输出不了,只能每行输出一个*不能每行输出多个* 解决方案 你不会用的println()吧 同行用print() 解决方案二: 你不会用的println()吧 同行用print() 解决方案三: println换行print不换行