Комплексный ввод токенизации - PullRequest
4 голосов
/ 22 августа 2011

Я пытаюсь токенизировать следующий ввод в Python:

text = 'This @example@ is "neither":/defn/neither complete[1] *nor* trite, *though _simple_*.'

Я хотел бы произвести что-то вроде следующего, избегая использования регулярных выражений:

tokens = [
        ('text', 'This '),
        ('enter', 'code'),
            ('text', "example")
        ('exit', None),
        ('text', ' is '),
        ('enter', 'a'),
            ('text', "neither"),
            ('href', "/defn/neither"),
        ('exit', None),
        ('text', ' complete'),
        ('enter', 'footnote'),
            ('id', 1),
        ('exit', None),
        ('text', ' '),
        ('enter', 'strong'),
            ('text', 'nor'),
        ('exit', None),
        ('text', ' trite, '),
        ('enter', 'strong'),
                ('text', 'though '),
                ('enter', 'em'),
                    ('text', 'simple'),
                ('exit', None),
        ('exit', None),
        ('text', '.')
    ]

Притворитесь, что вышеперечисленное производится генератором.Моя текущая реализация работает, хотя код несколько отвратителен и его нелегко расширить для поддержки ссылок.

Любая помощь будет принята с благодарностью.

Обновлено для изменения желаемого синтаксисаот сложной структуры вложенных списков до простого потока кортежей.Отступ для нас, людей.Форматирование в тексте ссылки в порядке.Вот простой синтаксический анализатор , который генерирует искомый результат лексинга, но по-прежнему не обрабатывает ссылки или сноски.

1 Ответ

1 голос
/ 23 августа 2011

Ну, вот более полный синтаксический анализатор с достаточной расширяемостью, чтобы делать все, что мне может понадобиться в будущем.Это заняло всего три часа.Это не очень быстро, но, как правило, выходные данные класса анализатора, который я пишу, все равно сильно кэшируются.Даже с этим токенизатором и парсером мой полный движок по-прежнему работает на уровне <75% от SLoC стандартного рендерера Python-Textile, оставаясь при этом несколько быстрее.Все без регулярных выражений. </p>

Разбор сносок остается, но это незначительно по сравнению с разбором ссылок.Вывод (на момент публикации):

tokens = [
    ('text', 'This '),
    ('enter', 'code'),
        ('text', 'example'),
    ('exit', None),
    ('text', ' is '),
    ('enter', 'a'),
        ('text', 'neither'),
        ('attr', ('href', '/defn/neither')),
    ('exit', None),
    ('text', ' complete[1] '),
    ('enter', 'strong'),
        ('text', 'nor'),
    ('exit', None),
    ('text', ' trite, '),
    ('enter', 'strong'),
        ('text', 'though '),
        ('enter', 'em'),
            ('text', 'simple'),
        ('exit', None),
    ('exit', None),
    ('text', '.')
]
...