Переход с Antlr4-Java на ParseKit-Objective-C: каналы в ParseKit?

Проблема:
Не знаю, как перевести содержимое файла грамматики Antlr4 ".g4" в соответствии с грамматикой для ParseKit.


В частности:
Как перевести -> Channel(HIDDEN); из грамматики Antlr4 в грамматику ParseKit.


Контекст:
Я создаю .Framework в Objective-C/Xcode для iOS. Мне нужно создать синтаксический анализатор, который имитирует основные функции сгенерированного синтаксического анализатора Antlr4 в Java. Способ разработки функциональности парсера не является проблемой; Мне интересно узнать больше о синтаксисе грамматики для ParseKit.


Грамматический код:

Antlr3:
WHITESPACE : [ \t\r\n]+ {$channel=HIDDEN;}

Antlr4:
WHITESPACE : [ \t\r\n]+ -> channel(HIDDEN);

ParseKit:
whitespace = /[\s\t\r\n]+/ __________________; Как игнорировать???< /эм>


Вопросы:
- Использует ли ParseKit поддерживает каналы?
- Какая грамматика используется
ParseKit для отправки скрытому Канал?
- В качестве альтернативы существует ли что-то похожее по своей природе на каналы, которое будет работать в ParseKit?


person JThora    schedule 21.02.2014    source источник


Ответы (1)


Создатель ParseKit здесь. В ParseKit нет ни функции Channels, ни функции перезаписи дерева ->, как в ANTLR. (Вообще, ParseKit не такой полнофункциональный, как ANTLR).

Однако вы, вероятно, можете добиться желаемого эффекта, используя функцию ParseKit discard.

При разработке грамматики ParseKit в вашем языке часто есть токены, которые представляют собой чистый синтаксис. Эти токены не важны ни для вычисления результата, ни для построения абстрактного синтаксического дерева (для дальнейшей обработки). Обычно вы хотите автоматически отбрасывать эти токены с помощью директивы ParseKit !.

Например, предположим, что в вашей грамматике ParseKit есть правило с именем primaryExpr, например:

primaryExpr = atom
            | '(' expr ')'!
            ;

Обратите внимание на ! после закрывающей скобки ')'. Это директива discard, которая указывает токенизатору ParseKit отбрасывать токен ) из потока токенов, сообщаемого вашим обратным вызовам ассемблера ParseKit (делегату).

Таким образом, в вашем обратном вызове -parser:didMatchPrimaryExpr: стек параметра assembly не будет содержать токен ). Токен ) уже будет сброшен. В этом случае отбрасывание желательно, так как ) представляет собой чистый синтаксис, который не важен для обработки соответствующего выражения в скобках.

Таким образом, чтобы отбросить неважный токен в вашей грамматике, поместите директиву ! сразу после него.

person Todd Ditchendorf    schedule 22.02.2014
comment
Тодд; Спасибо за хорошо написанный ответ! Будет ли следующий код, помещенный в ParseGenApp ParseKit, сообщать сгенерированному синтаксическому анализатору об отказе от показанного набора символов?: whitespace = /[\t\r\n]+/!; Правило грамматики «пробел» не используется для определения каких-либо других правил и является единственным. - person JThora; 24.02.2014
comment
Пожалуйста, проголосуйте и/или примите этот ответ и задайте свой новый вопрос как новый отдельный вопрос с тегом ParseKit. - person Todd Ditchendorf; 24.02.2014