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

http://goldparser.org/doc/grammars/group-attributes.htm

http://goldparser.org/doc/grammars/example-group.htm

Другие вопросы по тегам