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()
な場所で構文エラーが発生します。private
protected
public
定義または定義<ModifierOpt>
からを削除すると、エラーは消えます。<FuncDef>
<GlbAssignVar>
これを解決する方法がわかりません。助けてください!