我有以下(严重剥离)快乐语法
%token
'{' { Langle }
'}' { Rangle }
'..' { DotDot }
'::' { ColonColon }
'@' { At }
mut { Mut }
ident { Ident }
%%
pattern
: binding_mode ident at_pat { error "identifier pattern" }
| expr_path { error "constant expression" }
| expr_path '{' '..' '}' { error "struct pattern" }
binding_mode
: mut { }
| { }
at_pat
: '@' pat { }
| { }
expr_path
: expr_path '::' ident { }
| ident { }
它在模式中的标识符周围存在移位/减少冲突。默认情况下,Happy 选择转换,但在这种情况下,这不是我想要的:它会尝试将所有内容都硬塞进去constant expression
,即使它可能是identifier pattern
.
我读过优先级/关联性是解决此类问题的方法,但是我添加的任何内容都无法使语法朝着正确的方向发展(公平地说,我一直在黑暗中拍摄)。
使用一些明显的标记化,我想要:
x
屈服identifier pattern
mut x
屈服identifier pattern
std::pi
屈服constant expression
point{..}
屈服struct pattern
std::point{..}
屈服struct pattern
基本上,除非有一个{
或::
令牌等待被消费,否则一个标识符应该去identifier pattern
case。
如果我的问题不清楚,我深表歉意 - 部分问题是我很难确定问题所在。:(