0

私はこの同じ問題をほぼ2週間理解しようとしています。最初はシフト削減エラーでしたが、現在は削減削減問題です。私はそれを非常に多くの方法で試しましたが、今では助けが必要なところまで来ました. 私は多くの言語をコーディングしており、ほぼ 10 年前にコーディングを始めましたが、実際にヘルプを投稿したのはこれが初めてです。

パーサー クラスから BNF 文法を取得した、人気のあるスクリプト エンジンである Angel Script の文法クラスを作成しようとしています。ここで言語リファレンスを見つけることができますhttp://www.angelcode.com/angelscript/sdk/docs/manual/doc_script.html

そして、各ルールのクラス内に、コピーしようとしている BNF 文法のコメントを追加しました。現時点では、私が定義したキーワードを実際には使用していません。競合なしで動作するようになったら、戻ってクリーンアップを試みます。ここに私のクラスがありますhttp://pastebin.com/FydCTqmU

Dll を作成して文法エクスプローラーで実行するだけで、すべてのエラーが表示されます。ほとんどのエラーはすべて同じ問題に起因しているように見えるので、おそらくそれを修正できれば、ほとんどすべてが修正されると思います. 文法をより具体的ではないセクションに分割するのに役立つアプリを作成しましたが、それがより多くのreduce-reduceの問題にぶつかったと思います。

うまくいけばreduce-reduceエラーを通過できるようにコードを圧縮しようとしましたが、まったく同じままのようですが、見た目が雑然としています。誰かが私がそれを正しくするのを手伝ってくれるなら、私は喜んで数百ドルをペイパル経由で送ります. 私はこれを2週間以上続けてきたので、あきらめようとしています。私のメールアドレスは Anth0ny229@live.com です。

shift-reduce から reduce-reduce エラーに変わりました。何をしても問題が発生するようです。頭を包むことができず、本当に助けが必要です。私が言ったように、私は私に電子メールを送るだけで助けのために誰かにお金を払って喜んでいます. 私は、babelua のような Visual Studio 拡張機能を作成して、人々が Visual Studio を使用して Angel Script Scripts を記述できるようにすることを計画しています。また、うまくいけば、デバッグ サポートも追加します。これは素晴らしい追加になると思うので無料になります。したがって、最終的に機能する限り、誰かが何らかの形で支援できる場合は、彼らが報われることを確認して喜んでください. ありがとうございました。

状態 S0 (不十分) 入力に対する削減-削減競合: const 識別子 void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto :: シフト項目:

script' -> ·script EOF 
script -> ·script_0_list 
script_0_list -> ·script_0+ 
script_0+ -> ·script_0+ script_0 
script_0+ -> ·script_0 
script_0 -> ·import 
import -> ·import type import_0_opt identifier paramlist from string ; 
script_0 -> ·enum 
enum -> ·enum_0_opt enum identifier { identifier enum_1_opt enum_2_list } 
enum_0_opt -> ·shared 
script_0 -> ·typedef 
typedef -> ·typedef primtype identifier ; 
script_0 -> ·class 
class -> ·class_0_list class identifier class_1_opt { class_2_list } 
class_0_list -> ·class_0+ 
class_0+ -> ·class_0+ class_0 
class_0+ -> ·class_0 
class_0 -> ·shared 
class_0 -> ·abstract 
class_0 -> ·final 
script_0 -> ·mixin 
mixin -> ·mixin class 
script_0 -> ·interface 
interface -> ·interface_0_opt interface identifier interface_1_opt { interface_2_list } 
interface_0_opt -> ·shared 
script_0 -> ·funcdef 
funcdef -> ·funcdef type funcdef_0_opt identifier paramlist ; 
script_0 -> ·virtprop 
virtprop -> ·virtprop_0_opt type virtprop_1_opt identifier { virtprop_2_list } 
virtprop_0_opt -> ·private 
virtprop_0_opt -> ·protected 
script_0 -> ·func 
func -> ·func_0_opt func_1_opt identifier paramlist func_2_opt func_3_list statblock 
func_0_opt -> ·private 
func_0_opt -> ·protected 
func_0_opt -> ·shared 
script_0 -> ·var 
var -> ·var_0_opt type identifier var_1_opt var_2_list ; 
var_0_opt -> ·private 
var_0_opt -> ·protected 
script_0 -> ·namespace 
namespace -> ·namespace identifier { script } 
script_0 -> ·;

アイテムを減らす:

script_0_list -> · [EOF]
enum_0_opt -> · [enum]
class_0_list -> · [class]
interface_0_opt -> · [interface]
virtprop_0_opt -> · [const identifier void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto ::]
func_0_opt -> · [const ~ identifier void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto ::]
var_0_opt -> · [const identifier void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto ::]

トランジション:

script->S1, script_0_list->S2, script_0+->S3, script_0->S4, import->S5, import->S6, enum->S7, enum_0_opt->S8, shared->S9, typedef->S10, typedef->S11, class->S12, class_0_list->S13, class_0+->S14, class_0->S15, abstract->S16, final->S17, mixin->S18, mixin->S19, interface->S20, interface_0_opt->S21, funcdef->S22, funcdef->S23, virtprop->S24, virtprop_0_opt->S25, private->S26, protected->S27, func->S28, func_0_opt->S29, var->S30, var_0_opt->S31, namespace->S32, namespace->S33, ;->S34
4

1 に答える 1

0

競合とは、文法があいまいで、同じものを解析する方法が 2 つ以上あることを意味します。

reduce reduce conflict は、異なる非終端記号が同じ入力に適用できることを意味します。あなたの場合、「5」のような数字はint8、int16などの両方になる可能性があるためだと思います.

ヒント: GNU Bison は、Irony と同様の解析アルゴリズムを使用します。この種のエラーを処理する場合、ヘルプ ページが非常に役立ちます。

于 2015-06-15T13:27:18.927 に答える