2

正規表現では、次のように記述できます。

a(.)*b

これは、たとえば、文字列全体に一致します

acdabb

これを Happy のトークン ストリームでシミュレートしてみます。

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

ただし、Happy によって生成されたパーサーは認識しません。

acdabb

これを回避する方法はありますか/間違っていますか?

4

1 に答える 1

1

あなたが指摘したように、Happy は LALR(1) パーサーを使用します。これはドキュメントに記載されています。コメントで、右再帰に変更すると問題が解決すると指摘しましたが、初心者にとっては、それをどのように達成できるかが明確ではない可能性があります。再帰を変更するには、次のように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
     { }

これで、動作するパーサーが生成されます。

于 2015-04-18T13:00:55.577 に答える