Как отключить парсеры ParseKit по умолчанию?

Из Parsekit: как сопоставить отдельные символы кавычек?

Если вы определяете парсер:

@start = int;
int = /[+-]?[0-9]+/

К сожалению, он не будет анализировать целые числа с префиксом «+», если вы не включите:

@numberState = "+" // at the top.

В приведенном выше анализе чисел парсер по умолчанию «Symbol» даже не упоминался, но он все еще активен и переопределяет пользовательские парсеры.

Итак, с числами вы все еще можете исправить это, добавив директиву. Что, если вы пытаетесь создать парсер для "++"? Я не нашел ни одной директивы, которая могла бы заставить работать следующий парсер.

@start = plusplus;
plusplus = "++";

Влияние парсеров по умолчанию на пользовательский парсер кажется настолько произвольным. Почему я не могу разобрать "++"?

Можно ли просто полностью отключить парсеры по умолчанию? Кажется, они мешают, если я не делаю что-то общее.

Или, может быть, я все неправильно понял.

РЕДАКТИРОВАТЬ:

Я нашел парсер, который будет анализировать plus plus:

@start = plusplus;
plusplus = plus plus;
plus = "+";

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


person Eric    schedule 24.02.2012    source источник


Ответы (1)


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

У меня есть несколько ответов.

  1. Я думаю, чем больше вы узнаете, API ParseKit покажется вам очень элегантным и разумным. Имейте в виду, что я не играю в свой собственный рог, говоря это. Хотя я создал ParseKit, я не разрабатывал ParseKit API. Скорее, дизайн ParseKit почти полностью основан на проектах, найденных в Стивен Мецкер Создание синтаксических анализаторов на Java. Я настоятельно рекомендую вам ознакомиться с этой книгой, если вы хотите глубже понять ParseKit. Кроме того, это фантастическая книга о синтаксическом анализе в целом.

  2. Вы путаете состояния токенизатора с парсерами. Это две разные вещи, но детали более сложны, чем я могу здесь ответить. Еще раз рекомендую книгу Мецкера.

  3. В ходе ответа на ваш вопрос я обнаружил небольшую ошибку в ParseKit. Спасибо! Однако это не повлияло на ваш результат, описанный выше, поскольку вы использовали неправильную грамматику для получения результата, который, как кажется, вы искали. Вам необходимо обновить исходный код из проекта Google Code, иначе мой совет ниже вам не подойдет.


Теперь, чтобы ответить на ваш вопрос.

Я думаю, вы ищете грамматику, которая распознает ++ как один многосимвольный токен Symbol, а также распознает числа с ведущими символами + как явно положительные числа, а не токен + Symbol, за которым следует токен Number.

Я считаю, что правильная грамматика, которую вы ищете, выглядит примерно так:

@symbols = '++';    // declare ++ as a multi-char symbol
@numberState = '+'; // allow explicitly-positive numbers
@start = (Number|Symbol)*;

Введите так:

++ +1 -2 + 3 ++

Будет токенизирован так:

[++, +1, -2, +, 3, ++]++/+1/-2/+/3/++^

Два напоминания:

  1. Опять же, вам нужно будет обновить исходный код сейчас, чтобы увидеть эту работу правильно. Пришлось исправлять ошибку в этом случае.
  2. Это сложная штука, и я рекомендую прочитать книгу Мецкера, чтобы полностью понять, как работает ParseKit.
person Todd Ditchendorf    schedule 24.02.2012
comment
Я никогда раньше не слышал о ParseKit, спасибо за ваш ответ и проект... Мне есть что почитать :-) - person Jason Whitehorn; 24.02.2012
comment
Спасибо! Я думаю, что тогда я должен получить книгу... :) - person Eric; 25.02.2012
comment
Я мог бы также сказать, что я ищу: написать парсер для атрибутов SVG. - person Eric; 25.02.2012