Могу ли я использовать ANTLR для предварительно не обработанного кода? - PullRequest
4 голосов
/ 28 января 2011

Я собираюсь написать парсер для OpenEdge (язык баз данных 4GL) и хотел бы использовать ANTLR (или аналогичный).

Есть две причины, по которым я думаю, что это может быть проблемой:

  1. OpenEdge - это язык базы данных 4GL, который допускает такие конструкции:

    assign
        customer.name = 'Customer name'
        customer.age = 20
    .
    

    Где . в конце - разделитель строк, и этот оператор объединяет назначение двухполя базы данных.OpenEdge имеет еще много таких конструкций:

  2. Мне нужно сохранить все детали исходных файлов, поэтому я не могу развернуть операторы препроцессора до того, как смогу проанализировать файл, поэтому:

    // file myinc.i
    7 * 14
    
    // source.p
    assign customer.age = {myinc.i}.
    

    В приведенном выше примере мне нужно сохранить тот факт, что customer.age был назначен с использованием {myinc.i} вместо 7 * 14.

Могу ли я использоватьANTLR для достижения этой цели или мне нужно написать свой собственный синтаксический анализатор?

ОБНОВЛЕНИЕ:
Мне нужен этот анализатор не для создания из него исполняемого файла, а для кодаанализ.Вот почему мне нужно, чтобы AST содержал тот факт, что использовалось включение.

Ответы [ 5 ]

3 голосов
/ 28 января 2011

Просто чтобы уточнить: ANTLR не парсер, а генератор парсера.

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

Итак, ответ: да, вы можете использовать ANTLR.

Примечание. Я незнаком с OpenEdge, но для грамматики SQL обычно сложно написать синтаксический анализатор или грамматику. Взгляните на ANTLR wiki , чтобы увидеть, что написать задачу с нуля совсем не просто. Вы не упомянули об этом, но я предполагаю, что вы просматривали существующие парсеры, которые могут анализировать ваш язык?

К вашему сведению: вы, возможно, уже имеете его, но вот ссылка на документацию, включающую грамматику BNF для диалекта OpenEdge SQL: http://www.progress.com/progress/products/documentation/docs/dmsrf/dmsrf.pdf

2 голосов
/ 18 февраля 2011

Решение находится внутри самого архитектора OpenEdge.Вы должны извлекать файлы jar архитектора OpenGe (C: \ Progress \ OpenEdge \ oeide \ eclipse \ plugins \ com.openedge.pdt.core_10.2.1.01 \ lib \ progressparser.jar)

Здесь вы найдетепарсер классов.Они полностью связаны с Eclipse, но я сделал отделение от фреймворка Eclipse, и оно работает.Progressparser использует antlr, а документ antlr можно найти в следующей папке ... C: \ Progress \ OpenEdge \ oeide \ eclipse \ plugins \ com.openedge.pdt.core_10.2.1.01 \ oe_common_services.jar.

Внутри этого файла вы найдете определение antlr (проверьте для opensge.g).

Удачи.Если вам нужна отдельная среда затмения, просто напишите мне.

1 голос
/ 28 января 2011

Знаете ли вы, что уже существует анализатор с открытым исходным кодом для OpenEdge / Progress 4GL?Он называется Proparse , написанный с использованием ANTLR (первоначально он был написан вручную в самом OpenEdge, но в конечном итоге преобразован в ANTLR).Он написан на Java, но я думаю, что вы можете запустить его на C #, используя IKVM .

Лицензия - это лицензия Eclipse, поэтому она удобна для бизнеса.

0 голосов
/ 02 февраля 2011

Проблема с несколькими заданиями легко решается в грамматике.Просто разрешите множественные присваивания:

assign_stmt = 'assign' assignments '.' ;
assignements = ;
assignments = assignments target '=' expression ;

Один из методов, который вы можете использовать, - это дополнить грамматику, чтобы разрешить последовательности токенов препроцессора везде, где может быть разрешен нетерминал, и просто не выполнять расширение препроцессора.Для вашего примера у вас есть грамматическое правило:

expression = ... ;

, просто добавьте правило:

expression = '{'  include_reference '}' ;

Это работает в той степени, в которой препроцессор не используется для создания нескольких языков.элементы, которые выходят за нетерминальные границы.

Какой анализ кода вы намереваетесь сделать?В значительной степени, чтобы сделать что-нибудь, вам нужно будет указать имя и тип разрешения, что потребует расширения директив препроцессора.В этом случае вам понадобится более сложная схема, потому что вам нужно расширенное дерево для разрешения имен и информация о включении, связанная со стороной.

Наш инструментарий реинжиниринга программного обеспечения DMS имеет анализатор OpenEdge, в котором мы представляем предыдущий трюк "сохранить ссылки на включаемый файл".Синтаксический анализатор DMS C добавляет «макро узел» к дереву, где макро (OpenEdge «включить» - просто забавный способ написать определение макроса) дочерние узлы содержат дерево, как вы ожидаете, и справочную информацию, которая ссылается намакроопределение.Это требует некоторой тщательной организации и множества специальных операций с макроузлами, где они происходят.

0 голосов
/ 28 января 2011

Вы можете сделать то же, что делает препроцессор C - расширить свою грамматику с помощью прагм, задающих местоположение источника, и позволить вашему препроцессору генерировать код, наполненный этими прагмами.

...