11

私は、社内で20年前のプロプライエタリ言語の拡張を支援してきました。これは、チューリング完全な大規模な言語です。それを別の文法レジーム(Antlrなど)に変換することはオプションではありません(私はこれを決定することはできません)。

ほとんどの場合、文法の拡張はスムーズに進んでいます。しかし、時々私はreduce-reduceまたはshift-reduceを取得します

  • 排除するのは難しい
  • 時々単に意味をなさない(私の弱い脳にとって)

y.outputファイルと実験的な文法リファクタリングをじっと見つめた後、私は通常、行きたい場所にたどり着きました。時々私は不十分な妥協をしなければなりませんでした。

それで、ブラウジング、実験を強化し、変更のデバッグを可能にする、yacc文法を吸い込むことができるツールはありますか?

プロダクションを追加する場合、「どこでも使用されるアトミックプロダクション」(識別子を考えてください)「ルールfooとの競合」(はい、それよりも多くの情報、s / r、r / rがあります)以上のものを見たいです、しかし私はあなたが私のドリフトを得ると思います)。私の思考の上限を設定し、シンボルスタックとステートマシンを想像しようとする以外に、相互作用のヒントがあると便利です。

更新:明確にする必要があると思います。BerkeleyYaccを使用しています。私は最近のバージョンのBisonを使用してテストしています。出力のために、 -report=itemsetを使用して文法をコンパイルしました。

この投稿での私の目標は、yaccに付属している文法デバッグ機能を強化する外部ツールを探すことです。今日はデフォルト設定で苦痛です。Antlrで使用できるツールなど、より優れたインタラクティブツールを見つけるのを手伝ってください。

4

2 に答える 2

8

デバッグ出力を生成する、からいくつかの助けを得るかもしれません-それは基本的にシンボルスタックの状態などの完全なリストを提供します。yacc -d出力は高密度で大量であるため、すべてを直接読み取ろうとしても、多くのことを達成することはめったにありません(とにかく私にとっては決してありません)。ただし、変更を加えると(たとえば)r / rの競合が発生する場合はyacc -d、古い文法と新しい文法で実行してから、結果でdiffを実行して、変更内容のより詳細な概要を取得できます。 (s)競合を引き起こしました。

ただし、s / rの競合は多くの場合良性であることに注意してください。問題であることがかなり確実でない限り、「修正」しようとしても価値がないことがよくあります。ただし、r/rの競合については同じではありません。これらは良性の場合もありますが、比較的まれです。

編集:おっと-申し訳ありませんが、-vである必要があります。あなたはy.outputについて言及しているので、あなたは明らかにその部分を行う方法をすでに知っています。重要なのは、y.outputファイルを直接見ようとはせず、きれいに出てきたファイルと実際の競合について詳細を取得しなかったファイル(10を見つめずに)を比較することです。何十億行もの「もの」は問題ありません。

于 2009-10-28T23:50:06.077 に答える
2

これは私が得た最高のものです:http: //tldp.org/HOWTO/Lex-YACC-HOWTO-7.html

于 2009-10-28T23:47:35.883 に答える