Где я могу прочитать подробную документацию по определению грамматики для ParseKit? - PullRequest
3 голосов
/ 06 марта 2012

Я только начинаю разбираться с 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, вероятно, поможет мне, но было бы неплохо, если бы кто-нибудь помог мне начать работу с моим собственным небольшим примером, прежде чем я углублюсь в тему. Я только исследую идею, просто доказательство концепции.

1 Ответ

1 голос
/ 07 марта 2012

Разработчик 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. Tokenizing (выполняется PKTokenizer и изменяется TokenizerДирективы в вашей грамматике)
  2. Парсинг (выполняется синтаксическим анализатором, построенным из объявлений в вашей грамматике)

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

...