Запись компилятора для DSL в Python

PSRepository регистрируется для каждого пользователя , и, к сожалению, нет общесистемной опции.

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

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

6
задан too much php 4 December 2008 в 00:17
поделиться

7 ответов

Я всегда впечатлялся pyparsing. Автор, Paul McGuire, активен на Python list/comp.lang.python и всегда был очень услужлив с любыми запросами относительно него.

12
ответ дан 8 December 2019 в 02:30
поделиться

Существует много инструментов парсинга Python: http://nedbatchelder.com/text/python-parsers.html

7
ответ дан 8 December 2019 в 02:30
поделиться

Вот подход, который работает действительно хорошо.

abc= ONETHING( ... )
xyz= ANOTHERTHING( ... )
pqr= SOMETHING( this=abc, that=123, more=(xyz,123) )

Описание. Легкий к синтаксическому анализу.

И...

Это - на самом деле Python. Сделаны несколько объявлений класса и работа. DSL является на самом деле объявлениями класса.

То, что важно, - то, что DSL просто создает объекты. При определении DSL сначала необходимо запустить с объектной модели. Позже, Вы помещаете некоторый синтаксис вокруг той объектной модели. Вы не запускаете с синтаксиса, Вы запускаете с модели.

6
ответ дан 8 December 2019 в 02:30
поделиться

Peter,

DSLs являются хорошей вещью, таким образом, Вы не должны защищать себя :-) Однако Вы рассмотрели внутренний DSL? Они имеют столько профессионалов по сравнению с внешним (проанализированным) DSLs, что они являются, по крайней мере, стоящими рассмотрения. Смешивание DSL с питанием родного языка действительно решает много проблем для Вас, и Python не действительно плох во внутреннем DSLs, с with удобный оператор.

2
ответ дан 8 December 2019 в 02:30
поделиться

Я записал что-то вроде этого в работе, чтобы читать в определениях уведомления SNMP и автоматически генерировать классы Java и SNMP файлы MIB от этого. Используя этот небольшой DSL, я мог записать 20 строк своей спецификации, и это генерирует примерно 80 строк кода Java и 100 строк файл MIB.

Для реализации этого я на самом деле просто использовал прямую строковую обработку Python (разделение (), режущий и т.д.) для парсинга файла. Я нахожу строковые возможности Python быть достаточным для большинства моих (простых) потребностей парсинга.

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

2
ответ дан 8 December 2019 в 02:30
поделиться

Да, существуют многие - слишком многие - парсинг инструментов, но ни одного в стандартной библиотеке.

Из того, что, что я видел, СГИБ и SPARK популярны. СГИБ похож на yacc, но Вы делаете все в Python, потому что Вы пишете свою грамматику в docstrings.

Лично, мне нравится понятие синтаксического анализатора combinators (взятый от функционального программирования), и я вполне как pyparsing: Вы пишете свою грамматику и действия непосредственно в Python, и легко запуститься с. Я закончил тем, что произвел свои собственные древовидные типы узлов с действиями хотя, вместо того, чтобы использовать их значение по умолчанию ParserElement ввести.

Иначе можно также использовать существующий декларативный язык как YAML.

4
ответ дан 8 December 2019 в 02:30
поделиться

Для «малых языков», как тот, который вы описываете, я использую простой split, shlex (помните, что символ # определяет комментарий) или регулярные выражения.

>>> line = 'SOMETHING: !abc @123 #xyz/123'

>>> line.split()
['SOMETHING:', '!abc', '@123', '#xyz/123']

>>> import shlex
>>> list(shlex.shlex(line))
['SOMETHING', ':', '!', 'abc', '@', '123']

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

>>> import re
>>> result = re.match(r'([A-Z]*): !([a-z]*) @([0-9]*) #([a-z0-9/]*)', line)
>>> result.groups()
('SOMETHING', 'abc', '123', 'xyz/123')
2
ответ дан 8 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

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