2

私はParseKitの文法を書いて、iphoneアプリの基本的な命題論理文と一致させようとしています。誰かがどこが間違っているのか教えてもらえますか?

@start = wff;
wff = disjunction (implies disjunction)?;
disjunction = conjuction (or conjuction)*;
conjunction = notExpression (and notExpression)*;
notExpression = (not | not primaryExpression);
primaryExpression = variable | lbracket wff rbracket;
variable = p | q | r;

p = 'P';
q = 'Q';
r = 'R';

implies = '→';
and = '∧';
or = '∨';
not = '¬';
lbracket = '(';
rbracket = ')';

また、文法から解析ツリーを作成できるように、コールバックを追加するにはどうすればよいでしょうか。

4

1 に答える 1

3

ParseKitの開発者はこちら。

明らかな問題が 1 つconjunctionあります。文法のいくつかの場所で のスペルが間違っています。


ParseKit の Grammar Parser のエラー メッセージはそれほど大きくありません。理想的には、問題につながる素敵なエラー メッセージが表示されるはずです (ただし、これはオープン ソースなので、誰でもこの性質の修正に貢献できます)。

ただし、これらの問題をどのように見つけたかをお伝えできます。

  1. ParseKit の作業コピーをGoogle コードトランクの先頭に更新します。
  2. Xcode でブレークポイントをオンにして、すべての例外にブレークポイントを追加します。
  3. ParseKit 文法をこのファイルに配置します。~/Desktop/grammar.txt
  4. (オプション) 入力例をこのファイルに配置します。~/Desktop/input.txt
  5. DebugAppデバッグ構成でParseKit ターゲットを実行します。
  6. Runアプリの実行時に表示されるウィンドウの大きなボタンをクリックします。
  7. 例外がスローされるのを待ちます。ブレークポイントがヒットします。

文法にバグがある場合、次のような ParseKit アセンブラー コールバックで例外が発生した可能性が最も高いことがわかります。

- (void)parser:(PKParser *)p didMatchExpression:(PKAssembly *)a

aデバッグ コンソールに出力します。次のように表示されます。

(lldb) po a
(PKAssembly *) $1 = 0x00000001075a9010 [] /conjuction/ ^(/or/ /conjuction/)/*

これは、PKAssemblyコールバックに渡されたオブジェクトの出力です。ここで、ParseKit の文法パーサーが文法の解析に失敗した場所を確認できます。次の式の解析中に、ParseKit Grammar Parser が失敗したようです。

conjuction (or conjuction)*;

(キャレット)の位置から^、最初の を見た直後にパーサーがチョークしたことがわかりますconjuction

この式は、文法内の 1 行だけにあります。

disjunction = conjuction (or conjuction)*;

それで、この行にスペルミスがあることに気付きました。

このアプローチは、常に文法の問題のある行につながります。それが役立つことを願っています。

于 2012-11-30T03:02:56.250 に答える