1

私はParseKitを使用して言語の作成を調査し、おそらく小さなおもちゃのDSLを作成し始めました。ただし、Googleの現在のSVNトランクは、-[PKToken intValue]: unrecognized selector sent to instance ...この文法を解析するときにをスローします。

@start = identifier ;
identifier = (Letter | '_') | (letterOrDigit | '_') ;
letterOrDigit = Letter | Digit ;

この入力に対して:

foo

明らかに、何かが足りないか、プロジェクトが正しく構成されていません。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

ここでParseKitの開発者。

まず、ParseKitトークン化のドキュメントを参照してください。

基本的に、ParseKitは2つのモードのいずれかで動作します。それらTokens Modeをとと呼びましょうChars Mode。(これら2つのモードの正式な名前はありませんが、おそらくあるはずです。)

Tokens Modeはるかに人気があります。ParseKitを使用するほとんどすべての例で、の使用方法が示されますTokens Modehttp://parsekit.comのすべてのドキュメントでを使用していると思いますTokens Mode。ParseKitの文法機能(例で使用しているのはでのみ機能しますTokens Mode)。

Chars ModeParseKitのあまり知られていない機能です。私はこれまで誰にもそれについて尋ねられたことがありません。

したがって、モードの違いは次のとおりです。

  • ではTokens Mode、ParseKit Tokenizerは複数文字のトークン(Words、Symbols、Numbers、QuotedStringsなど)を出力し、作成したParseKitパーサーによって(プログラムまたは文法を介して)解析されます。
  • ではChars Mode、ParseKit Tokenizerは常に単一文字のトークンを出力します。このトークンは、プログラムで作成したParseKitパーサーによって解析されます。(このモードは一般的ではないため、現在、文法はこのモードでは機能しません)。

Chars Mode文字ごとに解析するRegularExpresionsを実装するために使用できます。


あなたの例では、無視し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のTokenizerから既に発行されたトークンで機能することに注意してください。個々の文字ではありません。

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
于 2012-12-09T23:48:49.717 に答える