LINUX.ORG.RU

История изменений

Исправление loz, (текущая версия) :

1. (ты видимо это сделал) как во *время разбора* пользоваться какими-то структурами данных, которые я раньше назвал «контекст» (именно это не умеют регекспы; перл дает возможность вставлять в регекспы свой код, но это выглядит ужасно и емнип эта фича экспериментальная до сих пор)

В parse не просто можно пользоваться структурами данных, в нем (через круглые скобочки) можно вызывать обычный код на реде, а значит можно и запросы к бд делать и гуй обновлять. Кстати название «контекст» ты не зря выбрал - в реде это синоним объекта и часто используется с parse :)

2. как в язык parse (это по факту dsl) добавить свой модификатор — т.е. чтобы для конкретной новой задачи не патчить весь парсер, а воспользоваться определенным ранее модификатором, который проверяет контекст; например «мы_находимся_внутри_текста» (т.е. не внутри атрибута и не внутри кода <script>), «мы_находимся_внутри_тэга_style» — можешь придумать любой по своему вкусу или как удобнее реализовывать в рамках твоего кода

Это черезвычайно просто:

Red []

parser: context [
	state: []
	rules: [
		any [
			number! (append state 'number) |
			word!   (append state 'word)   |
			time!   (append state 'time)
		]
	]
	run: func [input] [
		state: copy []
		parse input rules
		state
	]
]

probe parser/run [1 2 3]
; [number number number]
probe parser/run [x 5 y 10:30]
; [word number word time]

Исходная версия loz, :

1. (ты видимо это сделал) как во *время разбора* пользоваться какими-то структурами данных, которые я раньше назвал «контекст» (именно это не умеют регекспы; перл дает возможность вставлять в регекспы свой код, но это выглядит ужасно и емнип эта фича экспериментальная до сих пор)

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

2. как в язык parse (это по факту dsl) добавить свой модификатор — т.е. чтобы для конкретной новой задачи не патчить весь парсер, а воспользоваться определенным ранее модификатором, который проверяет контекст; например «мы_находимся_внутри_текста» (т.е. не внутри атрибута и не внутри кода <script>), «мы_находимся_внутри_тэга_style» — можешь придумать любой по своему вкусу или как удобнее реализовывать в рамках твоего кода

Это черезвычайно просто:

Red []

parser: context [
	state: []
	rules: [
		any [
			number! (append state 'number) |
			word!   (append state 'word)   |
			time!   (append state 'time)
		]
	]
	run: func [input] [
		state: copy []
		parse input rules
		state
	]
]

probe parser/run [1 2 3]
; [number number number]
probe parser/run [x 5 y 10:30]
; [word number word time]