Приоритет PLY токена - PullRequest
       5

Приоритет PLY токена

0 голосов
/ 08 октября 2018

Я использую 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, когда я не хочу, чтобы он максимально совпадал.

1 Ответ

0 голосов
/ 08 октября 2018

ОК, думаю, я знаю, что не так.Проблема здесь в том, что при совпадении r'[\s\S]+' оно буквально совпадает со всем, что может совпадать, то есть с целым файлом.Я изменил определение TEXT на r'[\s\S]' и позволил изменить синтаксический анализатор, который работает.

...