0

Goldparser で Shift-Reduce の競合が発生して困っています。

理論的には、次のスクリプトを解析できる PHP のような文法を作成しました。

public $Test = null;
protected $bDemo = true;

function Main()
{
}

private function Run()
{
}

一番上にグローバル変数を割り当て、その後に関数定義を配置します。

問題を絞り込むために、エラーを再現できる次の行に大きな文法を減らしました。明らかにこれは不完全です。関数にはパラメーターも戻り値もステートメントもありません...

"Start Symbol"   = <Script>

! ------------------------------------------------- Sets

{Name} = {Letter} + {Alphanumeric} + [_]

! ------------------------------------------------- Terminals

VarName        = '$'  {Name}*
FuncName       = {Name}*

! ------------------------------------------------- Rules

<Variable>       ::= VarName

<Value>          ::= 'null'
                   | 'true'
                   | 'false'

<Modifier>       ::= 'private'
                   | 'protected'
                   | 'public'

<ModifierOpt>    ::= <Modifier>
                   |

! ---------------

<GlbAssignVar>   ::= <ModifierOpt> <Variable> '=' <Value> ';'

<GlobalList>     ::= <GlobalList> <GlbAssignVar>
                   | <GlbAssignVar>

<GlobalListOpt>  ::= <GlobalList>
                   | 

! ---------------

<FuncDef>        ::= <ModifierOpt> 'function'  FuncName '('  ')' '{'  '}'

<FuncList>       ::= <FuncList> <FuncDef>
                   | <FuncDef>

<FuncListOpt>    ::= <FuncList>
                   |

! ---------------

<Script>         ::=  <GlobalListOpt> <FuncListOpt>

LALR テーブルを構築するとき、Goldparser は次のように教えてくれます。

「Shift-Reduce Conflict が修正されました。'private'、'protected'、'public' は完全なルールに従い、シフトすることもできます。この競合は、'reduce' よりも 'shift' アクションを選択することで解決されました。注意してください。一部の文法にアクセスできない可能性があります。すべての競合を削除することをお勧めします。"

しかし、適用される修正により、文法が正しく機能しなくなります。上記の例では、オプションとして宣言したにもかかわらず、' '、' '、または ' ' が必要function Main()な場所で構文エラーが発生します。privateprotectedpublic

定義または定義<ModifierOpt>からを削除すると、エラーは消えます。<FuncDef><GlbAssignVar>

これを解決する方法がわかりません。助けてください!

4

1 に答える 1