問題タブ [sablecc]
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.
eclipse - Eclipse で外部ツールを実行する際に特定のクラスを削除しますか?
現在のプロジェクトで一連のクラスを生成する Eclipse (3.4) に外部ツール (sablecc) を設定しました。このツールを実行して、これらのクラスをかなり頻繁に再生成する必要があります。つまり、sablecc を実行するたびに、sablecc が作成するパッケージ/クラスを手動で削除して、生成された新旧のクラスが競合しないようにする必要があります。これをEclipse内またはそれ以外から自動化する簡単な方法はありますか?
shift-reduce-conflict - SableCCとの競合をシフト/削減
私はSableCCと文法定義を初めて経験しました。私は次の文法(その一部)を持っています:
次のエラーがあります。
私はすべての選択肢にl_parとr_parを追加することでそれらを解決しました。ちなみに、読みやすさを向上させるはずですが、エレガントな方法でそれを行う方法はありますか?
ありがとう。
eclipse - SableCC で作成されたパーサーから始まる Eclipse 用のカスタム テキスト エディター
今日の質問は次のとおりです。私は大学の学部用にコード ジェネレーターを開発しています。それは非常に単純です。彼らは、人間が読めるカスタムの「スクリプト」言語を使用し、それを解析してから、これらの命令を Java に翻訳したいと考えています。私は SableCC を使ってこのトリックを行いましたが、とてもスムーズでした。現在の問題は、Eclipse 用のプラグイン エディターを作成する必要があることです。これは、主に構文を強調する目的と、場合によっては検証エラーをキャッチするためです。
「Eclipse でカスタム エディターを作成する方法」に関するチュートリアルをたくさん見つけましたが、理解できないのは、パーサーとスキャナーの権限を既に作成していますか? 編集者のためにそれを繰り返すのはナンセンスです。スキャナーをプラグイン内に統合する方法はありますか? どのクラスを拡張または実装する必要がありますか? チュートリアルを提案できますか?
parsing - prod =(expr | expr')*の形式のプロダクションルールでのsableccの問題
問題はにあります
に設定clsdata
した場合
またはに
うまく機能しますが、ご想像のとおり、私が意図したものと同じ意味ではありません。クラスでメソッドとフィールドの両方を許可する必要があります(順不同です!)。
clsdata
ですから、私の質問は、エラーが発生しないようにどのように定義すればよいかということです。再帰的な代替案を考えることもできますが、これを可能な限りクリーンに保ちたいと思います。
ありがとう
compiler-construction - 単純な和と乗算の文法による逆導出の問題
ボトムアップパーサーを使用して、たとえば入力文字列1 + 2 * 3
を「下」から「上」に移動する方法を理解するのに問題があります。
これが私が使用している文法です(Crafting aCompilerで見つかったものなので正しいと思います)
これは私の逆の派生です:
問題は、入力として整数を取得するたびに、整数が自動的に「変換」されることE
です。
私は与えられた文法が正しいことをかなり確信しています。また、いくつかの入力文字列(私が作成したPretty Printerの訪問者を利用)を使用してsableccで試してみましたが、すべて正しい結果が得られます。
そうすれば、問題は文法そのものではなく、自分にあることがわかります。では、私は何を間違っているのでしょうか。
ありがとう!
java - コンパイラのテスト
私は現在、sableccを利用して構築された種類のコンパイラに取り組んでいます。
簡単に言うと、コンパイラは仕様ファイル (これが解析しているものです) と .class ファイルの両方を入力として取り、.class ファイルのバイトコードを計測して、.class ファイルを実行するときにいずれかの仕様が違反していません (これは jml/code 契約に少し似ていますが、より強力です)。
分析フェーズの大部分をカバーする数十のシステム テストがあります (仕様が意味を成していること、および仕様が指定することになっている .class ファイルと一致していることを確認することに関連しています)。
それらを有効なテストと無効なテストの 2 つのセットに分けました。
有効なテストはソース コード ファイルで構成されており、コンパイラによってコンパイルされた場合、コンパイラ エラーや警告は表示されません。
無効なテストは、コンパイラによってコンパイルされたときに、少なくとも 1 つのコンパイラ エラー/警告が表示されるはずのソース コード ファイルで構成されています。
これは、分析フェーズにある間、うまく機能しました。問題は、コード生成フェーズをテストする方法です。過去に、コンパイラコースで開発した小さなコンパイラでシステムテストを行ったことがあります。各テストは、その言語のいくつかのソース ファイルとoutput.txt
. テストを実行するときは、ソース ファイルをコンパイルしてからそのメイン メソッドを実行し、出力結果が と等しいことを確認しoutput.txt
ます。もちろん、これはすべて自動化されていました。
さて、このより大きなコンパイラ/バイトコード計測器を扱うことは、それほど簡単ではありません。単純なコンパイラで行ったことを再現するのは簡単なことではありません。この段階では、システム テストから離れて、単体テストに集中するのがよいと思います。
コンパイラ開発者なら誰でも知っているように、コンパイラは多くの訪問者で構成されています。それらの単体テストをどのように進めるかについてはよくわかりません。私が見たところによると、ほとんどの訪問者は、その訪問者に関連するメソッドを持つ対応するクラスを呼び出しています (訪問者のために SRP を保持するという考えがあったと思います)。
コンパイラの単体テストに使用できる手法がいくつかあります。
訪問者の各メソッドを個別に単体テストします。これは、スタックレスの訪問者にとっては良い考えのようですが、1 つ (または複数) のスタックを使用する訪問者にとってはひどい考えのように見えます。次に、従来の方法で、標準 (読み取り、非ビジター) クラスの他の各メソッドの単体テストも行います。
訪問者全体を一度に単体テストします。つまり、ツリーを作成してからアクセスします。最後に、シンボル テーブルが正しく更新されたかどうかを確認します。その依存関係をモックすることは気にしません。
2) と同じですが、訪問者の依存関係をモックしています。
他には?
単体テストが sabbleCC の AST と非常に緊密に結合されるという問題がまだ残っています (これは本当に醜いです)。
現在、新しいテストを行っていませんが、システムをテストしないことは、遅かれ早かれ戻ってきて私たちを噛むモンスターに餌を与えることと同じであると確信しているため、列車を軌道に戻したいと思います。私たちが最も期待していないときにお尻;-(
コンパイラーのテストを行った経験がある人はいますか? 私はここでちょっと迷っています!
antlr - DSL実装のためのANTLRまたはSableCC?
誰かが言語の実装に両方を使用し、長所と短所を指摘してそれらを比較できますか? AST Walker コード生成をサポートする RAD ツールを探しています。SableCC は LALR であるため、「左再帰」をサポートしますが、ANTLR は LL(*) です。これは典型的な文法や DSL にとって重要ですか? ドメイン固有の分析も実行する必要があります。(私のコンパイラのターゲット言語は OpenCL C になります)。これは学生のプロジェクトのためのものなので、言語のフロントエンドを実装するという退屈な側面で多くの時間を無駄にしないことが重要です。
lexer - Sable CC パーサー ジェネレーターのプロダクション
それはかなり基本的なものに見えますが、最後の 30 分間、なぜ私たちが言うのか、{zero}
または{one}
次のプロダクションで {} が何を示しているのかを理解できませんでした?
java - JavaのファイルからEOFシンボルのようなsmthを取得する方法
みなさん、良い一日を。
私はsableCCを使用しており、 Reader オブジェクトを入力として受け取ります。たとえば、次のコードは正しく機能します。
StringReader は、文字列が終わった後に -1 を返すため:
与えます:
しかし、余分な行や文字なしで同じ文字列をファイル「prog」に書き込み、その上に FileReader を作成すると、-1 文字の代わりに FileReader が改行文字を返すため、コンパイラは存在しない 2 行目で中断します。
与えます:
ファイル リーダーから StringReader と同じ動作を取得する最短の方法は何ですか?