Я использую 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
.Затем он должен игнорировать все символы, если он не обнаружит теорему / лемму / определение / гипотезу / следствие / пример, в этом случае он временно входит в режим INITIAL
и сохраняет его или раздел (sub / subub), в этом случае он должен временновойдите в режим sec
.
Сейчас кажется, что в состоянии INITIAL
весь файл считается TEXT
, когда я не хочу, чтобы он максимально совпадал.