Где я могу прочитать подробную документацию по определению грамматики для ParseKit?

Я только начинаю разбираться с ParseKit, читаю «Основной синтаксис грамматики», но это только очень базовое введение. Теперь я быстро вышел из себя, когда хочу приступить к определению моей собственной грамматики. Куда мне идти отсюда?

Например, я хочу проанализировать файл журнала в очень специальном формате. Разбив его на заголовок, тело и нижний колонтитул, это будет мой BNF для первой строки заголовка:

<header-line-1> ::= <log-format> <log-id> "," <category> <EOL> 
<log-format> ::= "Type A Logfile" | "Logfile II" | "Some Other Format" 
<log-id> ::= "#" <long-int> 
<category> ::= <some unknown string>

Как мне это определить, чтобы ParseKit понял? Я зашел так далеко;

@start = header-line-1;
header-line-1 = log-format log-id "," category EOL;
log-format = 'Type A Logfile';
log-id = '#' ; // and then how to specify a long-int?!?
category = char+;
char = 'A' | 'a' | 'B' | 'b' | 'C'; //..etc...   Surely not?!?

Я подозреваю, что должен быть хотя бы способ определить диапазон символов?

Конечно, книга, цитируемая автором parsekit, вероятно, поможет мне, но было бы хорошо, если бы кто-нибудь помог мне приступить к работе с моим собственным небольшим примером, прежде чем я углублюсь в тему. Я только исследую идею, просто доказательство концепции.


person Rich    schedule 06.03.2012    source источник


Ответы (1)


Разработчик ParseKit здесь.

К сожалению, нет дополнительной (хорошей) документации по синтаксису грамматики ParseKit. На данный момент лучшими ресурсами являются:

  1. Книга Стивена Метскера "Построение синтаксических анализаторов на Java". Хорошие новости: это научит вас дизайну/внутренностям ParseKit. Плохая новость: функция ParseKit «Синтаксис грамматики» — это дополнительная функция, наложенная поверх ParseKit, которую я разработал и добавил сам. Поэтому в книге Мецкера это не описано, так как в его Java-библиотеке нет такой возможности.

  2. Файлы .grammar в цели Test проекта ParseKit Xcode. Здесь много реальных примеров грамматики. Вы можете многому научиться на собственном примере.

  3. Тег ParseKit здесь, в StackOverflow. Я ответил на множество вопросов, которые могут быть вам полезны.


Что касается вашего конкретного примера, вот как я, вероятно, определил бы его в синтаксисе ParseKit.

@symbolState = '\n'; // Tokenizer Directive
                     // tells tokenizer to treat new line chars as 
                     // individual Symbol tokens rather than whitespace
@start = headerLine*;
headerLine = logFormat logId comma category eol;
logFormat = ('Type' 'A' 'Logfile') | ('Logfile' 'II') | ('Some' 'Other' 'Format');
logId = hash Number;
category = Any+;

comma = ',';
hash = '#';
eol = '\n';

Важно помнить, что синтаксический анализ в ParseKit — это двухэтапный процесс:

  1. Токенизация (выполнена PKTokenizer и изменена Директивами токенизатора в вашей грамматике)
  2. Синтаксический анализ (выполняется синтаксическим анализатором, созданным с помощью объявлений в вашей грамматике)

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

person Todd Ditchendorf    schedule 07.03.2012
comment
Привет, Тодд, во-первых, замечательно, что ты ответил лично, спасибо - я тихо надеялся, что ты сделаешь;) Да, вчера вечером я провел некоторое время, играя с демо-приложением, просматривая примеры, и мой собственный пример работал; почти так же, как вы процитировали, но с использованием category = Word+. На самом деле я не знал (или проглядел) ключевое слово Any. Еще раз спасибо за вашу помощь, подтверждение того, что я, кажется, на правильном пути :) - person Rich; 07.03.2012