2015-06-04 2 views
1

Я пытаюсь понять поведение Qi's Difference Parsers.boost :: spirit :: qi разница поведение парсера

С чем-то вроде этого:

ruleA = 
    ruleAa 
| ruleAb 
| ruleAc 
; 

ruleB = 
ruleA - ruleAc 
; 

Я воображал, что анализатор будет соответствовать ruleB тогда и только тогда вход соответствует ruleAa или ruleAb. Другими словами, ruleB вычитал бы одну альтернативу (ruleAc) из правилаA. Это неверно?

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

В сущности, я пытаюсь это сделать: У меня есть правило типа ruleA, которое содержит набор альтернатив. Это правило используется в нескольких разных местах моей грамматики. Но в одном конкретном использовании мне нужно избегать вызова только одной из альтернатив. Кажется, что разностный парсер предназначен для этой цели, но, может быть, я недопонимаю?

Заранее благодарен!

ответ

1

Я предполагал, что синтаксический анализатор будет соответствовать правилу, если вход соответствует правилуAa или ruleAb. Другими словами, ruleB вычитал бы одну альтернативу (ruleAc) из правилаA. Это неверно?

(A|B|C) - C эквивалентно только (A|B) тогда и только тогда C никогда не совпадает со всем, что (A|B) будет соответствовать.

А простой пример, предположим:

A = int_; 
B = +space; 
C = char_; 

Поскольку C всегда соответствует где A или B будет соответствовать, то ясно, что делать (A|B) - C всегда приводит к отсутствию матча. То же самое для (A|B|C)-C. не

Короче любой A или B, что также матчи C больше не совпадает с something - C.


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

Как вы видели выше, это не так. Разностный анализатор вообще не выполняет/модифицирует/левый парсер. (Он просто отбрасывает некоторые совпадения, не зависящие от левой стороны).

Лучшее, что я могу придумать, это/просто использовать/(A|B) в одном месте и (A|B|C) в другом. Это действительно так просто: Скажите, что вы имеете в виду.

+0

Большое спасибо за этот очень четкий ответ. Ваша заметка о том, что «Разностный анализатор вообще не имеет/модифицирует/левый парсер.(Он просто отбрасывает некоторые совпадения, не зависящие от левой стороны). «Это именно то, о чем я думал неправильно. – pt3dNyc

Смежные вопросы