如何用Yacc实现一个Python的编译器
2017-04-28
展开全部
理论上是可以的,关键点在于您要在Lexer和Parser之间要多加一层,用于分析哪些地方是进入缩进,哪些地方是退出缩进。然后匹配到缩进的时候插入INDENT和DEDENT这样的Token。至于分析的方法,您可以先建一个Stack来存放每一层缩进块的Token,然后根据Lexer送来的Token中的行号、列号等信息来和Stack栈顶的数据进行对比,判断下来是该进入缩进的就push一个INDENT,并这个INDENT插入到输出的Token流中。发现是Stack中旧的Token匹配的,就把之前的缩进块pop出来,并在输出的Token流中插入DEDENT。然后在Paser层面处理语句块的时候可以这样处理(我只写大概意思的伪码,具体您自己看着办)block ::= INDENT NLS statements NLS DEDENTif ::= IF LPAREN expression RPAREN COLON block
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询