使用python ply进行部分解析

问题描述 投票:0回答:1

有没有一种简单的方法可以使用 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!
python parsing yacc ply
1个回答
0
投票

当 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...")
© www.soinside.com 2019 - 2024. All rights reserved.