PLY令牌优先级问题

时间:2018-10-08 20:25:44

标签: python ply

我正在使用PLY lex解析一些.tex文件。由于某些未知原因,令牌优先级无法按文档中所述工作。

以下是标记和状态:

tokens = ('BT', 'BL', 'BD', 'BCONJ', 'BCOR', 'BE', 'ET', 'EL', 'ED', 'ECONJ', 'ECOR', 'EE', 'SEC', 'SSEC', 'SSSEC', 'ES', 'TEXT','ITEXT','BIBS','MT',)

states = (('ig', 'exclusive'), ('sec', 'exclusive'))

以下是词法分析器使用的功能:

def t_ig_BT(t):
    r'\\begin\{theorem\}'
    t.lexer.begin('INITIAL')
    return t

def t_ig_BL(t):
    r'\\begin\{lemma\}'
    t.lexer.begin('INITIAL')
    return t

def t_ig_BD(t):
    r'\\begin\{definition\}'
    t.lexer.begin('INITIAL')
    return t

def t_ig_BCONJ(t):
    r'\\begin\{conjecture\}'
    t.lexer.begin('INITIAL')
    return t

def t_ig_BCOR(t):
    r'\\begin\{corollary\}'
    t.lexer.begin('INITIAL')
    return t

def t_ig_BE(t):
    r'\\begin\{example\}'
    t.lexer.begin('INITIAL')
    return t

def t_ET(t):
    r'\\end\{theorem\}'
    t.lexer.begin('ig')
    return t

def t_EL(t):
    r'\\end\{lemma\}'
    t.lexer.begin('ig')
    return t

def t_ED(t):
    r'\\end\{definition\}'
    t.lexer.begin('ig')
    return t

def t_ECONJ(t):
    r'\\end\{conjecture\}'
    t.lexer.begin('ig')
    return t

def t_ECOR(t):
    r'\\end\{corollary\}'
    t.lexer.begin('ig')
    return t

def t_EE(t):
    r'\\end\{example\}'
    t.lexer.begin('ig')
    return t

def t_INITIAL_ig_SEC(t):
    r'\\section\{'
    t.lexer.begin('sec')
    return t

def t_ig_SSEC(t):
    r'\\subsection\{'
    t.lexer.begin('sec')
    return t

def t_ig_SSSEC(t):
    r'\\subsubsection\{'
    t.lexer.begin('sec')
    return t

def t_sec_ES(t):
    r'\}'
    t.lexer.begin('ig')
    return t

def t_ig_BIBS(t):
    r'\\bibliographystyle'
    t.lexer.begin('INITIAL')
    return t

def t_INITIAL_MT(t):
    r'\\maketitle'
    t.lexer.begin('ig')
    return t

def t_INITIAL_sec_TEXT(t):
    r'[\s\S]+'
    return t

def t_ig_ITEXT(t):
    r'[\s\S]+'
    pass

def t_ANY_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)

该程序应该在数学论文中检测开头,结尾,部分,小节,子小节,定理,引理,定义,猜想,推论和示例,而忽略其余内容以产生摘要。

程序一开始应该保留所有字符,直到到达令牌MT。在这种情况下,控制杆应保留令牌并进入ig模式。然后,除非它检测到一个定理/引理/定义/猜想/推论/示例,否则它应该忽略所有字符,在这种情况下,它暂时进入INITIAL模式并保留它或在这种情况下保留(sub / subsub)部分应该暂时进入sec模式。

现在,当我不希望文件尽可能匹配时,似乎在INITIAL状态下,整个文件都被认为是TEXT

1 个答案:

答案 0 :(得分:0)

好的,我想我知道怎么了。这里的问题是,匹配r'[\s\S]+'时,它实际上匹配它可以匹配的所有内容,即整个文件。我将TEXT的定义更改为r'[\s\S]',并允许更改了有效的解析器。