今天要如何解析和解释Pascal语言的定义、复合语句、赋值语句、变量。还要聊聊符号表以及存储和查找变量。
BEGIN
BEGIN
number := 2;
a := number;
b := 10 * a + 10 * number / 4;
c := a - - b
END;
x := 11;
END.
你看,不只是数学计算了,还多了一些眼熟的编程语言或者说计算机系学生特有的知识:
-
Pascal程序的定义是一串复合的语句,加上一个句号。比如:
“BEGIN END.”
事先声明,这并不是一个完整的程序声明,后面会扩充它。
-
复合语句是什么意思呢?一个复合语句指的是一块代码,被BEGIN和END包起来的一系列语句,也可以是其他复合语句。在复合语句中的每一个语句,除了最后一个,都是分号结束的。最后一个语句可能有,也能没有分号。下面是一些例子:
“BEGIN END”
“BEGIN a := 5; x := 11 END”
“BEGIN a := 5; x := 11; END”
“BEGIN BEGIN a := 5 END; x := 11 END”
可以看到:
-
语句列表是一系列的语句。
-
一个语句,可以是一个符合语句,一个赋值语句,也可以是一个空语句。
-
赋值语句就是一个变量后面跟着赋值token,也就是一个冒号一个等号。比如 “a := 11” “b := a + 9 - 5 * 2”
-
一个变量是一个标识符。我们使用ID token来表示变量。token的值是一个变量的名字,比如a、number等等。这个a和b就是变量。“BEGIN a := 11; b := a + 9 - 5 * 2 END”
-
空的语句表示不再继续产生新的东西了。在解析器里,我们使用empty_statement语法规则去表示语句列表的结束,空语句用‘’BEGIN END‘’表示。
-
factor规则也升级了,可以处理变量了。
完整的语法是这么严肃的表示的:
program : compound_statement DOT
compound_statement : BEGIN statement_list END
statement_list : statement
| statement SEMI statement_list
statement : compound_statement
| assignment_statement
| empty
assignment_statement : variable ASSIGN expr
empty :
expr: term ((PLUS | MINUS) term)*
term: factor ((MUL | DIV) factor)*
factor : PLUS factor
| MINUS factor
| INTEGER
| LPAREN expr RPAREN
| variable
variable: ID
You probably noticed that I didn’t use the star ‘*’ symbol in the compound_statement rule to represent zero or more repetitions, but instead explicitly specified the statement_listrule. This is another way to represent the ‘zero or more’ operation, and it will come in handy