• 静思
  • 吴言片语
    • 吴言
    • 片语
    • 杂七杂八
  • 死于青春
    • 一路走好
  • 乌合麒麟
  • 纪念
    • 5.12
    • 3.23
  • GitHub
    • A List of Post-mortems
    • The Art of Command Line
  • 关于
    • Privacy Policy

程序员的信仰

金鳞岂是池中物,一遇风云便化龙

HOME » 学校生活 » Mini Java编译器(三)

Mini Java编译器(三)

2005 年 3 月 16 日 @ 上午 11:20 by Jay | 被踩了 2,922 脚

TOC

Toggle
  • 三、属性翻译文法
    • 主类声明(MainClass)
    • 类声明(ClassDeclaration)
    • 类继承声明(ClassExtendsDeclaration)
    • 变量声明(VarDeclaration)
    • 方法声明(MethodDeclaration)
    • 赋值语句(AssignmentStatement)
    • 数组元素赋值语句(ArrayAssignmentStatement)
    • if语句(IfStatement)
    • while语句(WhileStatemen)
    • 打印语句(PrintStatement)
    • 属性及动作解释
      • 动作
      • 属性
    • 符号表结构
    • 内存分配表结构
    • 附表
      • stmt_type
      • id_type
      • id_belongsTo

三、属性翻译文法

主类声明(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

 

方法声明(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>
<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_nameString标识符名称
id_levelint标识符的层次结构
id_belongsToString所属层次名称,(见附表)
id_addressint内存地址
stmt_typeint操作类型(见附表)
class_nameString类名
extra_paraObject附加参数
child_nameString子类名称
parent_nameString父类名称
class_nameString类名
id_typecompiler.type.Type变量类型类型(见附表)
para_listjava.util.List参数表
exp_valueint或boolean或任何程序中已定义的对象类型表达式值
exp_typecompiler.type.Type表达式类型

 

符号表结构

名称数据类型(针对Java语言)含义
nameString标识符名称
sortString标识符类别
typecompiler.type.Type变量类型
belongsToString归属信息(见附表)
addressint存储地址

 

内存分配表结构

名称数据类型(针对Java语言)含义
addressint标识符地址
sortString标识符类别
nameString标识符名称
valueObject标识符值

 

附表

stmt_type

名称值含义
stmt_assign1赋值语句
stmt_array_assign2数组元素赋值语句
stmt_if3if语句
stmt_while4while语句
stmt_print5打印语句

 

id_type

类含义size(字长(bytes))
ArrayType整型数组类型4
BooleanType布尔类型1
IntegerType整型类型4
ObjectType对象类型不确定
NonVariableType非变量0

 

id_belongsTo

标识符类型“belongsTo”属性内容
类无(分析时以文件为单位)
方法类名
类变量类名
方法内变量方法名
参数方法名


-- EOF --

除非注明(如“转载”、“[zz]”等),本博文章皆为原创内容,转载时请注明: 「转载自程序员的信仰©」
本文链接地址:Mini Java编译器(三)

分享

  • 点击分享到 Facebook (在新窗口中打开) Facebook
  • 点击以分享到 X(在新窗口中打开) X
  • 更多
  • 点击分享到Reddit(在新窗口中打开) Reddit
  • 点击分享到Telegram(在新窗口中打开) Telegram
  • 点击以在 Mastodon 上共享(在新窗口中打开) Mastodon

赞过:

赞 正在加载……

相关

Today on history:

【2012】2012年政府工作报告 脱水版
【2009】如何让Netbeans以英文模式启动
【2006】程序员是如何捕猎大象的 [zz]
Posted in: 学校生活 Tagged: java, 作业
← Mini Java编译器(二)
Mini Java编译器(四) →

android (9) apple (20) augmentum (9) Beijing (21) bt (8) career (28) coding (38) firefox (10) google (36) hibernate (11) ibm (11) iphone (10) java (93) linux (16) m$ (26) mac (58) macos (27) nazca (9) olympics (8) oo (8) playstation (10) rip (8) Shanghai (39) spring (9) tips (45) tommy emmanuel (8) ubuntu (12) usa (23) windows (9) 北航 (17) 博客 (29) 吐槽 (8) 周末 (9) 和谐社会 (26) 小资 (11) 愤青 (40) 方言 (10) 朋友 (77) 歌词 (8) 烟酒不分家 (18) 爱国 (19) 爱情 (8) 犯二 (15) 破解 (8) 足球 (11)

烫手山芋

  • 再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~ - 被踩了 27,407 脚
  • 生活,就是一个期待跟着一个期待 - 被踩了 21,357 脚
  • 星巴克饮品缩写大全(Starbucks Drink ID Codes)[zz] - 被踩了 18,409 脚
  • 从一个全角冒号说一下我为什么不感冒iOS - 被踩了 14,330 脚
  • 有关Character.isLetter()和Character.isLetterOrDigit() - 被踩了 13,591 脚

刚拍的砖

  • leo 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 花 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 无名氏 发表在《从一个全角冒号说一下我为什么不感冒iOS》
  • Jay 发表在《Mac OS geek级问题》
  • Wei Wang 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》

随便看看

  • 吙煋①篇17 年 ago
  • Tommy来了,你却走了9 年 ago
  • Nazca开博17 年 ago
  • 开始mac生活5 年 ago
  • What is a Good Team?9 年 ago

文以类聚

光阴似箭

其他操作

  • 登录
  • 条目 feed
  • 评论 feed
  • WordPress.org

Copyright © 2025 程序员的信仰.

Jay's Omega WordPress Theme by Jay

 

正在加载评论...
 

    %d