Здравствуйте, 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
.