0.2 Example: Straight-line Program Language
在正式学习编译理论前,我们简单地热个身。
先讨论一类最简单的语言:直线式程序语言。这类语言只有一般语句和表达式,没有循环和分支判断语句。
我们用形式化的文法规则来描述它的语法(理解成广义的上下文无关文法):
语句文法(statement):
Stm -> Stm; Stm
,即:一个语句可以是另外两个语句以 semicon(结束符)分隔组成(执行顺序从左到右),称CompoundStm
;Stm -> id := Exp
,即:一个语句可以是一个赋值语句(作用域内唯一合法标识符id
、一个表达式,执行顺序先Exp
后赋值),称AssignStm
;Stm -> print( ExpList )
,即:一个语句可以是输出语句(print
关键字 token、一个表达式列表,输出顺序从左到右),称PrintStm
;
表达式文法(expression):
Exp -> id
,即:一个表达式可以是仅仅一个标识符的陈列,称IdExp
;Exp -> num
,即:一个表达式可以是仅仅一个合法数字 token,称NumExp
;Exp -> Exp Bionp Exp
,即:一个表达式可以是两个表达式间用二元运算符连接(执行顺序先左后右),称OpExp
;Exp -> (Stm, Exp)
,即:一个表达式可以是一个语句和一个表达式的组合的序列(以逗号分隔,先执行左边的语句,再执行右边表达式),称EseqExp
;
表达式列表文法(Expression List):
ExpList -> Exp, ExpList
,即一个表达式列表可以由一个表达式和另一个表达式列表组成(逗号分隔),称PairExpList
(递归定义);ExpList -> Exp
,即一个表达式可以仅由一个表达式构成,称LastExpList
(递归定义终止);
二元运算符文法(Binary Operator):
Binop -> + or - or * or /
,即一个二元运算符只可以是+
,-
,*
,/
其中一个;