[任务布置]编译器构造实践

概述

    Jerry 语言总体上来说是 C 语言的子集,满足 Jerry 语言的词法、语法、语义均满足 C 语
言,除了 IO 语句。
    它没有 main 函数,而是从代码第一行开始,直到结束。它也不支持函数调用。
    IO 语句并不是调用函数,使用这样的语句来进行 IO:
           read x;
           write x + 1;
其中 read 和 write 都是 Jerry 语言的关键字。
    支持 if-else(else 可选)条件分支,while 循环语句,以及 break 跳出循环。
    支持四则运算,正负号,比较运算,逻辑运算(“与”“或”运算支持条件短路)。
    支持链式赋值。
    以上各种运算、赋值的优先级与 C 语言一致。
    支持多维数组但是不支持指针。
    语句以分号结尾。允许空语句。
    Jerry 语言将被编译成为二进制字节码,由 Jerry 虚拟机执行。

Jerry 语言中的关键字及作用

int / real        声明变量,前者声明整型变量,后者声明实型变量。
read / write      IO 操作,前者输入,后者输出。
if / else         分支语句使用的关键字,与 C 语言一样
while / break     循环语句使用的关键字,与 C 语言一样

数据类型

    支持两种数据类型:整型(int)和实型(real),分别相当于 C 语言中的整型(int)和双精度浮点(double)。

词法

    变量名称规则跟 C 语言一样。常数整数的形式是十进制数字序列,不支持十六进制或八进制数值。浮点数形式与 C 语言一致。

语法(EBNF)

# Jerry 语言
Jerry -> BasicBlock <END>
# 基本块
BasicBlock -> ε
BasicBlock -> Sentence BasicBlock
# 语句
Sentence -> <EOS>
Sentence -> IfElseBranch
Sentence -> WhileLoop
Sentence -> Declaration
Sentence -> <IO> Variable <EOS>
Sentence -> Assignment <EOS>
Sentence -> <BREAK> <EOS>
Sentence -> <LBRACE> BasicBlock <RBRACE>
# if-else 分支
IfElseBranch -> <IF> <LPARENT> Assignment <RPARENT> BasicBlock ElseBlock
ElseBlock -> <ELSE> BasicBlock
ElseBlock -> ε
# while 循环
WhileLoop -> <WHILE> <LPARENT> Assignment <RPARENT> BasicBlock
# 声明
Declaration -> <TYPE> VariableRegister <EOS>
VariableRegister -> VariableRegister <COMMA> Variable Initialization
VariableRegister -> Variable Initialization
Initialization -> <ASSIGN> Assignment
Initialization -> ε
# 运算相关
# 赋值
Assignment -> Condition <ASSIGN> Assignment
Assignment -> Condition
# 逻辑运算
Condition -> Condition <OR> ConjunctiveCondition
Condition -> ConjunctiveCondition
ConjunctiveCondition -> NegativeCondition
ConjunctiveCondition -> ConjunctiveCondition <AND> NegativeCondition
NegativeCondition -> <NOT> Comparison
NegativeCondition -> Comparison
# 比较运算
Comparison –> Comparison <COMPARATOR> Expression
Comparison -> Expression
# 表达式
Expression -> Expression <OP_MUL_DIV> Term
Expression -> Term
#项
Term –> UnaryFactor
Term -> Term <OP_PLS_MNS> UnaryFactor
# 一元因子, 可能有正负号
UnaryFactor -> SimpleFactor
UnaryFactor -> <OP_PLS_MNS> SimpleFactor
# 简单因子
SimpleFactor -> <INTEGER>
SimpleFactor -> <REAL>
SimpleFactor -> Variable
SimpleFactor -> <LPARENT> Assignment <RPARENT>
# 变量(包括数组下标等信息)
Variable -> <IDENT> Dimensions
Dimensions -> <LBRACKET> Assignment <RBRACKET> Dimensions
Dimensions -> ε

语义限制

break 必须在 while 循环内,且仅跳出当前循环。
比较运算得出的是整型数,为真时值为 1,否则为 0。
整型数或表达式可以为逻辑条件。实型数或表达式不可以为条件。
数组声明时,每一维必须显示给出大小。对数组进行初始化仅对其第一内存单元进行初始化。
赋值的左部及 read 的参数必须是变量引用(这一条非语法限制)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值