問題タブ [parsekit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - ParseKit の簡単な例が機能せず、parserFromGrammer がコンソールに PEGRecognitionExceptions で多くの例外を表示する
ParseKit に出会い、http://parsekit.com/iphone.htmlの指示に従って IOS プロジェクトに組み込みました。Google Code から取得しました。チェックアウトしたバージョンは 1543 です。すべてが正常にコンパイルおよびビルドされました。
次に、投稿の1つから(最終的に機能する)単純な例を使用しようとしました-単純なParseKitの例が機能しません
実行が行に到達したとき
コンソールに多くのエラー メッセージが表示されます。didMatchFoo と didMatchBar は起動しません。
コンソールからのメッセージは次のとおりです。
コールバックを呼び出さず、エラーも返しません。
ポインタやヘルプをいただければ幸いです。
PS - 上記の例外が何であるかを確認するために、ParseKit のいくつかの NSLOG ステートメントのコメントを外しました。
の文法について
私は得た
parsing - この ParseKit 文法の何が問題になっていますか?
解析しようとしているドキュメントは次のとおりです。
文法を次のように定義しました。
私が問題を抱えている部分は、phraseDictionary です。
ParseKit の無限先読みで、phraseDictionary の文法に合わせて進めるべきではないでしょうか?
私は何が欠けていますか?
ありがとう、シュリダール
parsekit - parser:didMatchInterior: コールバックの生成
ParserGenApp を使用して静的パーサーを生成しています。生成されたコードには、「parser:didMatch[Rule]:」という形式のアセンブラー コールバックが含まれています。ただし、DempApp の JavaScriptSyntaxParser では、コールバックの形式は「parser:didMatchInterior:」などです。ParserGenApp にそのような呼び出しを生成させることはできますか? それとも手動で追加しましたか?
ありがとう/ミカエル
parsekit - ParserGenApp を使用し、作成されたクラスを含める Parsekit は失敗します。PKParserFactory を呼び出して同じ文法を指定すると機能します
私は ParserGenApp を実行し、結果のクラスを私のアプリで使用する文法 (以下に含まれていますが、他の例でも同じことを行います) を持っています。次のエラーで失敗します。
ただし、同じアプリで、
うまく動作します。
文法は次のとおりです。
ios - iOS 7 用のテキスト エディターの作成
問題
TextKit がどのように機能し、それを使用してテキスト エディターを作成する方法を理解する必要があります。エンドユーザーが操作する可視テキストのみを描画する方法を理解するか、processEditing メソッドで変更されたテキスト範囲全体に属性を適用せずに、可視テキストのみに属性を遅延適用する方法を決定する必要があります。
バックグラウンド
iOS 7 は TextKit とともに登場しました。私は、TextKit を完全に実装するトークナイザーとコードを持っています (Apple の TextKitDemo プロジェクトを参照してください。リンクは以下に示されています)...そして動作します。しかし、それは本当に遅いです。NSTextStorage によってテキストが解析されると、同じスレッドの processEditing メソッドで、編集されたテキストの範囲全体を色付けする必要があります。スレッドへの作業のオフロードは役に立ちません。それは単に遅すぎる。変更された範囲のみを再帰属できるようになりましたが、範囲が大きすぎるとプロセスが遅くなります。状況によっては、変更が行われた後にドキュメント全体が無効になる可能性があります。
ここに私が持っているいくつかのアイデアがあります。これらのいずれかが機能するかどうか、または正しい方向に私を微調整するかどうかを教えてください.
1) 複数の NSTextContainer
ドキュメントを読むと、NSLayoutManager 内に複数の NSTextContainers を追加できるようです。これを行うことで、NSTextContainer に描画できる行数を定義できるだけでなく、どの NSTextContainer がエンドユーザーに表示されるかを知ることもできるはずです。このルートに行く場合、それが実現可能かどうかを確認するためだけに多くの時間を投資する必要があることを私は知っています. 最初のテストでは、必要な NSTextContainer は 1 つだけであることが示唆されています。したがって、NSLayout をサブクラス化するか、レイアウト マネージャーがどのテキストをどのテキスト コンテナーに入れるかを決定するラッパーを作成する必要があります。うん。また、特定の NSTextContainer を描画する時が来たことを TextKit がどのように知らせてくれるのかわかりません。
2) NSLayoutManager を使用した範囲の無効化
invalidateLayoutForCharacterRange:actualCharacterRange: を使用して、layoutManager を無効にします。しかし、これは実際に何をし、どのようにテキスト帰属フェーズをオフロードするのでしょうか? 特定のテキストを強調表示する必要があることはいつ通知されますか? また、NSLayoutManager が遅延してグリフを描画することがわかります...どのように? いつ?これはどのように役立ちますか? 実際にテキストをレイアウトする前にバッキング文字列に属性を付けることができるように、この呼び出しを利用するにはどうすればよいですか?
3) NSLayoutManager drawGlyphsForGlyphRange:atPoint: メソッドをオーバーライドします。
私は本当にこれをしたくありません。そうは言っても、Mac OS X では、NSAttributedStrings には、スタイル情報が表示のみに使用される一時的な属性という概念があります。これにより、強調表示のプロセスが大幅に高速化されます。問題は、iOS 7 TextKit フレームワークに存在しないことです (または、そこにあり、私はそれについて知りません)。このメソッドをオーバーライドすることで、一時的な属性を使用して得られるのと同じタイプの速度が得られると信じています... NSTextStorage 属性に触れることなく、このメソッドですべてのレイアウト、色、および書式設定の質問に答えることができるためです。ストリング。唯一の問題は、このメソッドが NSLayoutManager クラスで提供されている他のメソッドに関連してどのように機能するかわかりません。幅と高さの状態を保持していますか?小さすぎる場合、NSTextContainer のサイズを変更しますか? また、テキスト バッファーに追加された文字のグリフのみを描画します。画面全体を再描画しません。ごく一部にすぎません...それで問題ありません。これをどのように扱うかについていくつかのアイデアがあります...しかし、グリフをレイアウトしたいという気持ちは本当にありません。これは大変な作業であり、これを行う良い例は見つかりませんでした。
私はあなたが提供しなければならない助けを大いに感謝します.
感謝の気持ちを込めて、ここ数年で使用したすべてのフレームワークとリファレンスをリストします。それらがあなたの役に立てば幸いです。
構文強調表示フレームワーク:
- http://colorer.sourceforge.net/
- https://github.com/MikeJ1971/Glint (文字列、コメントなどには対応していません)
- https://projects.gnome.org/gtksourceview/features.html (トークン生成用の適切なライブラリを提供します。GTK で動作しますが、別のレイアウト マネージャー用に書き直される可能性があります)
- http://parsekit.com/ (優れたパーサー。ただし、範囲を修復する必要がある場合は、API をラップしてステート マシンを作成する必要があります)
- http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Languages/LanguageKit/
- https://github.com/CodaFi/IDEKit (素晴らしい仕事です。このコードにはたくさんの良いアイデアがあります。私の問題は、範囲を修復する方法がまったくわからないことです)
- http://www.crimsoneditor.com/ (古い Windows コード エディター。非常に優れたトークナイザーを備えています。少し読みにくいですが、正規表現は使用していません。上記のどのフレームワークよりもはるかに高速です)
資力:
- http://cocoafactory.com/blog/2012/10/29/how-to-use-custom-nsattributedstring-attributes/
- https://github.com/objcio/issue-5-textkit
- http://alexgorbatchev.com/SyntaxHighlighter/
- http://docs.xamarin.com/samples/TextKitDemo/ (Apple のデモ)
- http://cocoadev.com/ImplementSyntaxHighlighting (必ずすべての子記事を読んでください。すばらしい内容です)
これらのフレームワークのほとんどは同じです。範囲のコンテキスト切り替えを考慮しない (またはコンテキストを提供するためにラッパーを作成する必要がある) か、ユーザーがテキスト (文字列、複数行のコメントなど) を変更してもコンテキスト範囲を修復しません。最後の要件は非常に重要です。トークナイザーが変更の影響を受ける範囲を特定できない場合、文字列全体を再度解析して属性を付与する必要があるためです。これに対する唯一の例外は、Crimson Editor です。このトークナイザーの問題は、トークン化時に状態を保存しないことです。描画時に、アルゴリズムはトークンを使用して描画の状態を判断します。ドキュメントの先頭から始まり、テキストの表示範囲に到達するまで。言うまでもなく、
もう 1 つの問題は、フレームワークが Apple と同じ MVC パターンに従っていないことです。これは当然のことです。完全に機能するエディターを持つフレームワークはすべて、フレームワークが構築されている API (つまり、GTK、Windows など) によって提供されるフックを使用します。これにより、画面のどこにいつ描画するかに関する情報が提供されます。私の場合、TextKit では、変更された範囲全体を processEditing に帰属させる必要があるようです。
多分私の観察は間違っています。(そうであることを願っています!!)おそらく、たとえばParseKitは、私が必要としている目的で機能しますが、その使用方法がわかりません。もしそうなら、私に知らせてください!そして、ありがとう!
objective-c - 算術パーサー
ParseKit Tests のTDArithmeticParser.mの上にパーサーを構築しています。テストでTDArithmeticParserTest.mを拡張しました。failing
問題は、文法がこのテストで機能しない理由が理解できないことです。対応する算術パーサーの BNF 文法は次のとおりです。
問題を特定するのに役立つアイデアに非常に感謝しています。
java - Antlr4-Java から ParseKit-Objective-C への切り替え: ParseKit のチャネル?
問題:
Antlr4 ".g4" Grammar ファイルの内容を ParseKit の Grammar に一致するように翻訳する方法がわかりません。
具体的には、Antlr4 Grammar から ParseKit Grammar に
変換する方法です。-> Channel(HIDDEN);
コンテキスト:
iOS 用の Objective-C/Xcode で .Framework を作成しています。Java で Antlr4 生成パーサーの基本機能を模倣するパーサーを生成する必要があります。パーサーの機能を設計する方法は問題ではありません。ParseKitの文法構文についてもっと知りたいと思っています。
文法コード:
Antlr3 :
WHITESPACE : [ \t\r\n]+ {$channel=HIDDEN;}
Antlr4 :
WHITESPACE : [ \t\r\n]+ -> channel(HIDDEN);
ParseKit :無視する方法???
whitespace = /[\s\t\r\n]+/ __________________;
質問:
- ParseKit はチャネルをサポートしていますか?
- ParseKitが隠しチャネルに送信するために使用する
文法は何ですか?
-または、ParseKit で機能するチャネルに似た性質のものはありますか?
objective-c - ParseKit の ParserGenApp Grammar を使用して文字の範囲 [a-zA-Z] を指定する方法
問題:
ParseKit のGrammarを使用して文字の範囲を定義できません。
(大文字の有無にかかわらず、A から Z までの範囲の文字)。
環境:
ParseKit のParserGenAppを使用してパーサーを生成しています。
パーサーは .Framework 用で、カスタム言語パーサーとして機能します。パーサーは、 Antlr4 for Java
を使用して生成された動作中のパーサーを模倣することです。
例:
Antlr4: CHAR : [a-zA-Z];
正規表現: "[a-zA-Z]"
大文字を含む 'a' から 'z' までの任意の文字を検出します
代替正規表現: "[c-xB-Y]"
質問:
ParserGenApp を使用して文字の範囲を文法的に定義するにはどうすればよいですか?
文字/文字の「単語」や「数字」のようなParseKit
の文法指令はありますか?
範囲を宣言する別の方法はありますか?