在正则表达式中,我可以写:
a(.)*b
这将匹配整个字符串,例如
acdabb
我尝试使用Happy中的令牌流来模拟它。
t : a wildcard b
wildcard : {- empty -} | wild wildcard
wild : a | b | c | d | whatever
但是,Happy生成的解析器无法识别
acdabb
有没有办法绕过这个/我做错了吗?
答案 0 :(得分:1)
正如您所说,Happy使用LALR(1)解析器,noted in the documentation。您在评论中注意到,更改为正确的递归可以解决问题,但对于新手来说,可能无法确定如何实现。要更改递归,wilcard wild
将重写为wild wildcard
,从而生成以下文件:
{
module ABCParser (parse) where
}
%tokentype { Char }
%token a { 'a' }
%token b { 'b' }
%token c { 'c' }
%token d { 'd' }
%token whatever { '\n' }
%name parse t
%%
t
: a wildcard b
{ }
wildcard
:
{ }
| wildcard wild
{ }
wild
: a
{ }
| b
{ }
| c
{ }
| d
{ }
| whatever
{ }
现在生成一个有效的解析器。