概述
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 的参数必须是变量引用(这一条非语法限制)。