有没有一种简单的方法可以使用 python ply 执行部分解析? 换句话说:不是一次解析整个源代码,而是可以解析最多 表达式结束,
yield
其结果并交回控制权?
例如,以下玩具语法会产生预期的结果 输出。然而,一个人如何能一个句子一个句子地消费(就像使用生成器一样)而不是全部 一次句子?
import ply.lex as lex
import ply.yacc as yacc
data = '''\
a sentence. another
sentence.
'''
tokens = ('WORD', 'DOT')
t_WORD = r'\w+'
t_DOT = r'\.'
t_ignore = ' \t\n'
lexer = lex.lex()
def p_text(p):
'''text : text sentence DOT
| sentence DOT'''
p[0] = '\n'.join(p[1:-1])
def p_sentence(p):
'''sentence : sentence WORD
| WORD'''
p[0] = ' '.join(p[1:])
parser = yacc.yacc()
print(parser.parse(data)) # parses all sentences at once!
当 PLY 解析器在函数的文档字符串中识别出产生式的实例时,就会调用每个
p_
函数。因此,在您的示例中,每次解析器识别出 p_sentence
时都会调用 sentence
。如果您想在每个sentence
之后暂停,只需在p_sentence
中插入一个暂停即可。例如:
def p_sentence(p):
'''sentence : sentence WORD
| WORD'''
p[0] = ' '.join(p[1:])
input(f"p_sentence just recognized {p[0]!r} Hit Enter to continue...")