第九部分开始了对语言特性的支持,根据语言定义BNF:
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
variable→ID
empty→
expr→term ((PLUS | MINUS) TERM)∗
term→factor ((MUL | DIV) factor)∗
factor→PLUS factor | MINUS factor | INTEGER | LPAREN expr RPAREN | variable
知识点梳理
- 计算机程序语言的一些基本知识,譬如什么是表达式(expression),什么是语句(statement)。
- 符号表。由于引入了变量,如何再次访问到这些变量呢?把他们放到符号表中,这里只有一个全局符号表
GLOBAL_SCOPE
- 新的grammar规则设计的理论知识其实就是LL(1)。什么是LL(1)?
练习
1. 关键字的大小写敏感问题
在读取id的时候,根据ID的大写字符串去关键字中搜索,如果有则返回大写关键字,也就是说不管程序中的关键字是大写还是小写,内部始终是用的大写的方式。
token = RESERVED_KEYWORDS.get(result.upper(), Token(ID, result))
2. 把’/’转换成关键字div
RESERVED_KEYWORDS = {
'DIV': Token('DIV', 'DIV'),
'BEGIN': Token('BEGIN', 'BEGIN'),
'END': Token('END', 'END'),
}
#if self.current_char == '/':
# self.advance()
# return Token(DIV, '/')
3. 修改解释器,使得支持下划线开始的名字命名
def _id(self):
...
while self.current_char is not None and (self.current_char.isalnum() or self.current_char == '_'):
...
def get_next_token(self):
...
if self.current_char.isalpha() or self.current_char == '_':
return self._id()
...