GOLD Parser, включая комментарии
Я работаю над проектом по конвертации одного языка в другой и использую GOLD Parser. Мне нужно иметь возможность включать комментарии в мою конверсию, потому что мы не хотим их терять. Проблема заключается в том, что CommentLine и CommentBlock обрабатываются как шум, и они захватываются и выбрасываются. Есть ли простой способ отключить это поведение, чтобы, когда комментарий читался, он отправлялся через остальную часть дерева, чтобы я мог обработать его как любое другое утверждение?
Если нет, может ли кто-нибудь помочь мне преобразовать CommentLine в правило, которое при анализе будет рассматриваться как любое другое утверждение? Я использую грамматику VBScript с сайта GOLD Parser:
! Special comment definition
Comment Line = ''
На данный момент я могу выбрать только один вариант: когда мой движок читает маркер комментария, берет необработанные данные и номер строки источника и добавляет их в словарь, к которому я могу затем обратиться при обработке других токенов. Это выполнимо, но может стать грязным.
1 ответ
Начиная с 5.0 Gold Parser изменился способ обработки нескольких групп, которые имеют конечный терминал. Это приводит к определению, которое вы используете, чтобы не работать (я полагаю, вы только что удалили часть Rem, чтобы построить грамматику?)
Начиная с 5.0 есть два основных изменения:
- Лексические группы
- Группы и терминальные атрибуты могут быть изменены
из-за этого будут использоваться новые строки, которые будут определены, если новая строка необходима, новая строка будет объявлена автоматически. (например, с комментарием).
Комментарий +X будет автоматически классифицирован как "шум" и будет удален при разборе, чтобы избежать определения комментариев как шума, вам нужно специально указать ему, что это что-то существенное для логики синтаксического анализатора.
Кроме того, код, который вы использовали, только нашел начало комментария, но ничего не сделал с ним, чтобы "захватить" что-либо после того, как символ был найден, нам нужно объявить то, что мы ищем. Вы можете сделать это чем-то вроде:
! Special Whitespace definition ( All Whitespace's excluding new-lines )
{WS} = {Whitespace} - {CR} - {LF}
! Special Comment Line definition ( All words,special White-spaces and defined symbols until a Line Break is found )
Comment Line = ''({Alphanumeric} | {WS} | [.,-+="] )*{All Newline}
Rem Line = rem
Comment Line @= {type= Content}
Rem @= {type = Content }
При этом обе они объявляются как две группы на основе строки (строка комментария и строка Rem), и мы определяем, что они оба имеют тип Content, в результате чего обе они обрабатываются как Content, а не по умолчанию. (и поэтому не должен быть удален парсером).
Надеюсь, что это помогло, для дальнейшего чтения:
http://goldparser.org/doc/grammars/define-groups.htm