我真的陷入了 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 冲突已修复为‘私人’、‘受保护’、‘公共’可以遵循已完成的规则,也可以进行转移。通过选择‘转移’操作而不是‘减少’来解决冲突。小心,一些部分语法可能无法访问。建议您尝试删除所有冲突。”
但它应用的修复使语法无法正常工作。在上面的示例中,尽管我将它们声明为可选的function Main()
,但在需要 ' private
'、' protected
' 或 ' ' 的地方出现语法错误。public
当我<ModifierOpt>
从<FuncDef>
定义或定义中删除时,错误消失了<GlbAssignVar>
。
我不知道如何解决这个问题。请帮忙!