PLY 代币优先级问题
PLY token priority issue
我正在使用 PLY 来对一些 .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
模式。然后它应该忽略所有字符,除非它检测到 theorem/lemma/definition/conjecture/corollary/example,在这种情况下它暂时进入 INITIAL
模式并保留它或 (sub/subsub) 部分在这种情况下它应该暂时进入sec
模式。
现在似乎在 INITIAL
状态下,当我不希望它尽可能匹配时,整个文件被认为是 TEXT
。
好的,我想我知道出了什么问题。这里的问题是,当 r'[\s\S]+'
被匹配时,它从字面上匹配它可以匹配的所有内容,即整个文件。我将 TEXT
的定义更改为 r'[\s\S]'
并允许更改有效的解析器。
我正在使用 PLY 来对一些 .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
模式。然后它应该忽略所有字符,除非它检测到 theorem/lemma/definition/conjecture/corollary/example,在这种情况下它暂时进入 INITIAL
模式并保留它或 (sub/subsub) 部分在这种情况下它应该暂时进入sec
模式。
现在似乎在 INITIAL
状态下,当我不希望它尽可能匹配时,整个文件被认为是 TEXT
。
好的,我想我知道出了什么问题。这里的问题是,当 r'[\s\S]+'
被匹配时,它从字面上匹配它可以匹配的所有内容,即整个文件。我将 TEXT
的定义更改为 r'[\s\S]'
并允许更改有效的解析器。