Идея проанализировать символьную схему синтаксиса

Люди я реализую странную вещь, я должен записать утилиту, чтобы проанализировать схему синтаксиса в формате обычного текста и преобразовать его в xml формат, вещь в основном идентична как это от IBM (как в "Создании Задания без Преобразований" часть): http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls17.htm, которым кажется Типичный синтаксический анализатор/лексический анализатор как ANTLR / yacc/бизон, не может иметь дело с этим видом материала, одна идея, которую я имею, состоит в том, чтобы преобразовать схему синтаксиса в символьный битовый массив и определить некоторую функцию как more_up, move_down, оставленный, право или поэтому для пересечения целой схемы для моделирования процесса понимания как человеческого невооруженного глаза. Tho это звучит не достаточно опытным, я не выяснял другой лучший подход. Кто-либо однажды играл с подобным сценарием? Возможно, Вы могли любезно пролить некоторый свет на это.

Заранее спасибо!

5
задан Ripley 10 June 2010 в 14:54
поделиться

2 ответа

Идея "сетки символов" для доступа к отдельным символам кажется основополагающим шагом; другой ответ показывает, как это сделать просто замечательно. Теперь вы можете обращаться к сетке произвольно и легко следовать горизонтальным или вертикальным линиям.

Настоящая проблема заключается в том, что вы хотите построить граф, представляющий то, что говорит сетка символов. Такой граф будет состоять из узлов, дуг и аннотаций.

Вероятно, проще всего найти узлы, которые, вероятно, обозначаются (см. другой ответ) символами, представляющими точки ветвления на диаграмме (например, +). Каждая дуга будет представлять собой строку символов, ведущих к изгибу дуги или к другому узлу. Следование таким строкам символов должно быть довольно простым (:-) ) и может дать строку, представляющую дугу, даже если в ней есть изгибы.

Скорее всего, вы захотите перечислить все узлы (просто просканируйте массив). Аннотации узлов должны находиться поблизости, и вы можете просто просканировать небольшой радиус вокруг расположения узлов.

Вы захотите перечислить каждую дугу, выходящую из узла, и собрать строку, представляющую дугу.

Я бы передал строку-дугу лексеру, чтобы он разобрал ее на части; она может иметь интересное содержание (например, аннотацию в виде последовательности символов).

На этом этапе у вас есть узлы и дуги с соответствующими аннотациями. Построить соответствующий граф из них должно быть довольно просто.

1
ответ дан 15 December 2019 в 06:16
поделиться

Я никогда раньше не делал ничего подобного, но я бы подошел к этому так.

Во-первых, я бы начал с чего-то вроде этого:

class CharGrid(object):
    def __init__(self, text):
        self.lines = text.split('\n')

    def __getitem__(self, pos):
        try:
            col, row = pos
        except (TypeError, ValueError):
            raise KeyError('%r not a 2-tuple' % (pos,))
        if row >= len(self.lines):
            return ' '
        line = self.lines[row]
        if col >= len(line):
            return ' '
        return line[col]

, чтобы я мог получить доступ к символам в тексте через 2D-координаты:

grid = CharGrid("""Creating a No-Conversion Job

>>-onpladm create job--job--+--------------+-- -n--------------->
                            '- -p--project-'

>-- -d--device-- -D--database-- -t--table----------------------->

   .---------------------------------------------------------------------.
   V                                                                     |
>----+-----------------------------------------------------------------+-+-><
     |                                                            (1)  |
     '-+-------------+--+-------------+--| Setting the Run Mode |------'
       '- -S--server-'  '- -T--target-'
""")

print ''.join((grid[0,0], grid[1,0], grid[2,0]))
print ''.join((grid[0,2], grid[1,2]))

(уступая)

Cre
>>

После этого задача будет преобразовывать 2D-сетка символов в 1D-последовательность символов:

  1. прочтите этикетку в первой строке
  2. просканируйте вниз по первому столбцу, пока не найдете >>
  3. сканирование вправо от текущей позиции, пока не найдете [ что угодно]

... и т. д. Следуйте таблице в порядке наглядности.

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

2
ответ дан 15 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: