【发布时间】:2014-03-16 21:54:46
【问题描述】:
在正则表达式中,我可以这样写:
a(.)*b
这将匹配整个字符串,例如
acdabb
我尝试在 Happy 中使用令牌流来模拟这一点。
t : a wildcard b
wildcard : {- empty -} | wild wildcard
wild : a | b | c | d | whatever
但是Happy生成的解析器不识别
acdabb
有没有办法解决这个问题/我做错了吗?
【问题讨论】:
-
可以通过将上述转换为左递归形式(通配符:|通配符通配符)来消除移位/减少错误。我认为左递归或右递归对于 LALR 解析器并不重要。但是,如果我遗漏了什么,我仍然很好奇。
-
原因是 Happy 使用的前瞻次数的限制。正确的递归版本是 LALR(1)。
-
我的意思是左递归版本是 LALR(1),右递归版本不是;对此感到抱歉。