您的位置:首页 > 编程语言 > Python开发

python解释器实现及其嵌入式应用:实现语法支持

2017-02-20 15:14 656 查看
第九部分开始了对语言特性的支持,根据语言定义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()
...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: