問題タブ [irony]
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.
parsing - 文法での shift-reduce 競合の解決に関する問題
Ironyを使用して小さなパーサーを作成しようとしています。残念ながら、「シフト削減の競合」が発生します。文法は私の得意分野ではなく、この 1 つの小さなことを完了するだけで済みます。エラーを生成する簡略化された文法は次のとおりです。
「shift-reduce 競合」とは何を意味し、どうすれば解決できますか? それは私の文法があいまいであることを意味していると私は推測していますが、私は自分の論理を十分にひねってその方法を理解することはできません.
追加:明確にするために - 「asd」は単なるリテラル文字列「asd」です。したがって、次の式がこの文法によって解析されると予想されます。
追加 2:言い忘れましたが、文法の語根は ですLogicalExpression
。
追加 3:ああ、わかった! あいまいさは、
次の 2 つの異なる方法で解釈できます。
しかし、どうすればこれを解決できますか?OK、AND または OR のどちらか一方を他方よりも強くすることができます (いずれにせよ意図していました)。しかし、オペレーターが 1 人しかいない場合でもエラーが表示されるようになりました。つまり、これも同じエラーを生成します。
この場合、私はこれが欲しい:
これに解析されます:
これを行うためのあいまいでない方法は何ですか?
追加 4:わかりました!
これは、演算子の優先順位を NOT->AND->OR として、すべてのブール式を解析します。「asd」は、用語を意図した表現に置き換えることができます。
c# - Irony for .net の使用方法の学習を支援する
私はIronyに追いつくために努力しています。端末、非端末、トークン、ステートマシン、連想性、抽象構文ツリーなど、まだ理解していない用語がいくつか出てきます。
誰かがこれらの用語のいくつかに何らかの意味を与えることができますか? 私は、Irony に関する素晴らしい記事を読み続けています。そのため、Irony の使用方法を学ぶためにあなたが提供できる助けがあれば、それは素晴らしいことです。
太字で編集
parsing - 構文の定義方法
私は言語処理が初めてで、Irony を使用して次の構文のパーサーを作成したいと考えています。
ここで、name1 は xml 要素の名前で、value は要素の値で、スペースを含めることもできます。
含まれているサンプルを次のように変更しようとしました。
ただし、値にスペースが含まれている場合、これは機能しません。これは、構文を変更せずに (Irony を使用して) 実行できますか (値を引用符で囲むなど)?
どうもありがとう!
visual-studio - カスタム Visual Studio 言語サービスのインストール
非常に役立つ記事「Writing Your First Visual Studio Language Service」の指示に従って、ソフトウェア スタジオの内部スクリプト言語用に新しい Visual Studio 言語サービスを作成しました。文法はうまく機能し、いくつかの単純な goto ケースを実行して実行し、テキストの色付けを行いました。Irony GrammarExplorer と Visual Studio Experimental Hive の両方でテストを行いました。ビジュアル スタジオで通常どおり使用し、初期のテストとフィードバックのために他の数人のプログラマーに展開する準備ができていると感じています。
問題は、言語サービスのインストール方法がわからないことです。実験的なハイブで動作するこの素敵な小さな DLL がありますが、Visual Studio を起動するたびに実行する方法がわかりません。私はインターネット全体を見てきましたが、特定のステップがどこを見ても見過ごされていることがわかりました。多分私は盲目なのかもしれませんし、私が思っているよりずっと簡単なのかもしれませんが、誰かが私の言語サービスをインストールする方法について詳細な手順を教えてくれたら本当にありがたいです.
前もって感謝します!
c# - 皮肉: AST ノードの評価に関するチュートリアル?
私はIronyで単純な文法を定義し、素晴らしいコンパクトな AST を生成しました。
現在、評価をどうするか検討中です。問題は、これを行う方法に関するチュートリアルが見つからないことです。
定義した AST ノードは 2 つだけです。
これにより、次の出力が生成されます。
私が望む出力は次のとおりです。
使うべきではないと思いますContext.Write()
。サンプルは、物を押したりcontext.Data
、はじいたりすることを示しています...しかし、それがどのように機能するかはよくわかりません。
pi
自動的にプッシュされ、最後に1つの要素がポップオフされるため、最後に追加されると思いますcontext.Data
か?? よくわかりません。
いくつかのポインタまたはチュートリアルへのリンクがあればいいでしょう。
また、さまざまなノード タイプをどのように処理すればよいですか? 各「タグ」には、別のタグ、文字列リテラル、変数、数値の 4 種類のコンテンツを含めることができます。if(node is StringLiteral) ....
メソッドのようなものを書く必要がありますEvaluateNode
か?
私はこれを見つけましたが、AST をループするだけで、EvaluateNode
.
そして、これはデータ スタック内の単一の値を置き換えるものです...しかし、これがどのように出力されるかなどは実際には説明されていません。
明確にするために、EvaluateNode
メソッドをオーバーライドして自分のIrony.Ast.AstNode
やりたいことを実行する方法を知りたいと思っています。
わかりました、私はこの行の最後にその一口をたどりました:
これはデフォルトの評価ルーチンに含まれています....おそらく電卓アプリではうまく機能しますが、私のものではあまり機能しません。現在、スクリプト インタープリターをバイパスする方法を見つけようとしていますが、グローバルを設定する方法がわかりません。
c# - 皮肉: 2 つのトークン間のスペースを許可しない方法は?
次のように、 Ironyで PHP スタイルの変数を定義しようとしています。
$
と の間にスペースを入れることが許可されていることを除いて、うまく機能しますidentifier
。それを防ぎたい。どのように?
新しいカスタマイズされた端末を作成する必要がありますか? IdentifierTerminal
もしそうなら、私はまだ魔法を利用することができますか?
調べてみると、実際には「 NameIncludesPrefix IdentifierTerminal
」のフラグがあることがわかりますが、それは 1 か所でしか使用されていません。接頭辞がこのCompoundTokenDetails
オブジェクトに保存されているように見えます...使用方法がわかりません。編集:気にしないでください、これは行き止まりでした。これらのフラグは、変数の動作に修飾子を追加するためのものです。
これはちょっと効く...
私はそれが何でOuputTerminal
あるかはよくわかりません..現在のプレビュー位置に基づいたある種の動的プロパティだと思いますか? Irony での解析方法は少し奇妙だと思います...
とにかく、これの問題は、次のコードのように構文エラーがある場合に、VariableTerminal
以前に で行っていた方法ではなく、this を使用した場合です。"$" + IdentifierTerminal"
と言っていた識別子端末
予想される構文エラー: { real string $ true false ...
しかし、変数は代わりにこのエラーを返します:
無効な文字: 'c'
前のエラーの方が便利だったと思います。なぜ別のエラーが吐き出されているのかよくわかりません...代わりにそれを言うにはどうすればよいですか?
parsing - C# 以外の言語用の皮肉なパーサーのようなソフトウェア?
Irony .NET 言語実装キットと同じことを行うプログラムはありますか?
c# - 「else」ブロックを定義するにはどうすればよいですか?
これが私が試していることです:
しかし、私はshift-reduce conflict
. 理由はよくわかりません...可能であれば、貪欲に「else」を取得しないでください。「if」ブロックのみが続くようにelseブロックを定義する方法がよくわかりません。
ノードとif_else
ノードを持つブロック ノードが最適だと思います。なぜなら、AST をトラバースしようとするときに、戻って前の兄弟をチェックする必要がないからです。if
else
文法の詳細を確認する必要がある場合は、お知らせください。「ブロック」は基本的に{ blah }
(間の一連のステートメント{}
) として定義されます。
オプションのブロックとして試してみてください:
それも好きじゃない。それでも警告をスローします。
c# - 皮肉: KeyTerm を変数よりも優先する方法は?
関連する皮肉な文法のチャンク:
問題は、「タグ」と「変数」の両方が同じ場所に現れる可能性があることです。パーサーに変数よりもタグを優先させたいのですが、常に変数を優先します。どうすればそれを変更できますか?
andに変更しようとしましtag_blk.Rule
たが、何の役にも立ちません。パーサーはあいまいさについても文句を言いません。PreferShiftHere() + html_tag_kw + attr_args_opt + block;
ImplyPrecedenceHere(-100) + html_tag_kw + attr_args_opt + block;
visual-studio-2010 - Irony で最初の言語を作成しましたが、それを Visual Studio 2010 に取り込むにはどうすればよいですか?
この に従ってみましたが、ウィザードの最後でエラーが発生します。2010 と互換性があるかどうかはわかりません。このビデオを Ookで見ていますが、Irony と関連付ける方法がわかりません。Irony はすでに多くの面倒な作業を行ってくれていると思いますが、ITaggerProvider
VS が公開している他の 100 のインターフェイスとうまく連携させる方法がわかりません。それ、どうやったら出来るの?