Разработчик ParseKit здесь.
Во-первых, см. документацию по токенизации ParseKit.
По сути, ParseKit может работать в одном из двух режимов: назовем их Tokens Mode
и Chars Mode
. (Для этих двух режимов нет официальных названий, но, возможно, они должны быть.)
Tokens Mode
намного популярнее. Практически каждый пример использования ParseKit, который вы найдете, показывает, как использовать Tokens Mode
. Я считаю, что вся документация на http://parsekit.com использует Tokens Mode
. Функция грамматики ParseKit (которую вы используете в своем примере, работает только в Tokens Mode
).
Chars Mode
— очень малоизвестная функция ParseKit. Я никогда раньше не спрашивал об этом.
Итак, отличия в режимах:
- В
Tokens Mode
токенизатор ParseKit создает многосимвольные токены (например, слова, символы, числа, строки в кавычках и т. д.), которые затем анализируются созданными вами парсерами ParseKit (программно или с помощью грамматик).
- В
Chars Mode
токенизатор ParseKit всегда выдает токены односимвольные, которые затем анализируются синтаксическими анализаторами ParseKit, которые вы создаете программно. (грамматика в настоящее время не работает с этим режимом, так как этот режим не популярен).
Вы можете использовать Chars Mode
для реализации регулярных выражений, которые анализируют посимвольно.
В вашем примере вы должны игнорировать
Chars Mode
и просто использовать
Tokens Mode
. Следующие встроенные продукты предназначены только для
Chars Mode
. Не используйте их в своих грамматиках:
(PK)Letter
(PK)Digit
(PK)Char
(PK)SpecificChar
Обратите внимание, как все эти произведения звучат так, как будто они соответствуют отдельным символам. Это потому, что они делают.
Ваш пример выше, вероятно, должен выглядеть так:
@start = identifier;
identifier = Word; // by default Words start with a-zA-Z_ and contain -0-9a-zAZ_'
Имейте в виду, что продукты в ваших грамматиках (парсеры, такие как identifier
) будут работать с токенами, уже выпущенными из токенизатора ParseKit. Не отдельные символы.
IOW: к тому времени, когда ваша грамматика начнет анализировать входные данные, входные данные уже будут токенизированы в токены типа Word, Number, Symbol, QuotedString и т. д.
Вот все встроенные продукты, доступные для использования в вашей грамматике:
Word
Number
Symbol
QuotedString
Comment
Any
S // Whitespace. only available when @preservesWhitespaceTokens=YES. NO by default.
Также:
DelimitedString('start', 'end', 'allowedCharset')
/xxx/i // RegEx match
Также есть операторы для составных парсеров:
// Sequence
| // Alternation
? // Optional
+ // Multiple
* // Repetition
~ // Negation
& // Intersection
- // Difference
person
Todd Ditchendorf
schedule
09.12.2012