Re[5]: PEG-парсер
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.03.10 17:58
Оценка:
Здравствуйте, para, Вы писали:
P>под терминальным символом я понимаю:
P>
P>//именованный: spaces
P>spaces                = ' '*;
P>//неименованные: '*' и '/'
P>mulOrDiv        : int = simplExpr (('*' / '/') spaces simplExpr)*;
P>

P>проблема была в следующем:
P>в парсере не происходило добавления терминальных символов к АСТ, а я брал за терминальные символы участки исходного текста, разделённые НЕтерминальными символами, в результате в списке терминальных символов, находилось:
P>"10 " вместо "10" и " "
P>и "+ " вместо "+" и " "

Так и должно быть. У тебя же такая грамматика.

Если бы ты реализовал все как я описывал бы, то для каждого подправила ты бы вставил отдельный Caoture и все стало бы выделяться.

P>проблема была в следующем:

P>при парсинге или даже при формировании грамматики терминальные символы не обрабатывались как Rule.Capture
P>более того у них не сохранялись имена (spaces, digit..) и вообще при оптимизации грамматики именнованые "инлайнились" и становились неименованными.

Все правильно. Марос должен вставлять Rule.Capture для каждого подправила правила для которого имеется обработчик.

P>В новой ревизии я добавил сохранение имени для (spaces, digit..), а также добавление именованных терминальным символов в АСТ.


P>Мне кажется получился уже довольно функциональный код. Наверное можно строить и сложные грамматики. пока только одно ограничение: не использовать неименнованные терминальные символы:...


Ты видимо не очень хорошо понял то что я излагал. Прочти мое описание еще раз.

P>в ближайшее время займусь рефакторингном того сумбура, который я внёс))


Меня вот это как раз интересует. Но об этом давай в отдельной подветке теме поговорим, чтобы не искать часами нужных сообщений. Вот здесь
Автор: VladD2
Дата: 15.03.10
.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.