快乐解决错误

时间:2014-03-16 21:54:47

标签: parsing haskell lex happy

在正则表达式中,我可以写:

a(.)*b

这将匹配整个字符串,例如

acdabb

我尝试使用Happy中的令牌流来模拟它。

t : a wildcard b
wildcard : {- empty -} | wild wildcard
wild : a | b | c | d | whatever

但是,Happy生成的解析器无法识别

acdabb

有没有办法绕过这个/我做错了吗?

1 个答案:

答案 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
     { }

现在生成一个有效的解析器。