deque上的模式匹配

时间:2017-02-26 16:34:21

标签: haskell pattern-matching deque

我正在尝试在haskell中对deque进行一些模式匹配,但是有一些问题。

以下是我正在尝试做的一些解释。

我正在尝试从Refal到Haskell实现编译器。 Refal是一种使用模式匹配的语言。所以典型的refal函数如下所示:

    RefalFunc {
         e.1 s.1 (e.2) 's' t.1 t.2 t.1 e.2 = e.1 e.2
         e.1 ' ' e.2 = 'foo' e.1 'foo' e.2
         e.1 = 'anyexpression'
    }

所以这个函数采用refal-expression(由术语组成)并尝试将其与3个模式中的1个匹配,如果成功,则根据右侧的规则将refal-expression转换为另一个。

e.1,e.2 .. - 表示一些refal表达式 t.1 t.2 - 表示某些术语,例如“(e.1 t.2 e.2)”是一个术语,“e.1 t.2 e.2”不是 s.A s.1 - 表示符号 's' - 意味着象征''。还有一些其他类型的符号,但没关系。

在我的编译器中,refal-expressions表示为deques,因此对于每个refal函数,我需要根据某种模式生成一个函数,该函数需要一些deque并对其进行转换。 所以我有类似的东西

    myFunc1:: Deque -> Deque
    myFunc1 deq = if matchPattern1 deq then doSomeWork1
                  else if matchPattern2 deq then doSomeWork2
                  ...
               where matchPattern1 = ...
                     matchPattern2 = ...
                     ....

所以,主要的问题是,我真的不知道如何做matchTattern函数。

所以,对于给定的deque,我可以很容易地找到第一个(或最后一个)术语或符号,但是当我遇到e.1时,我不知道该怎么做,这意味着部分双端队列具有未知大小。

所以这是一个例子。 Deque:(5 + 6)* 7 *(5 +(4 + 1))*(5 + 6)*(5 + 6)//这里的每个符号都是deque的一个元素,每个非Bracket符号都是术语,每个(/ 一些符号 /)都是一个术语

我需要检查这个deque是否与以下模式匹配(并找到合适的分区)

 pattern1: t.1 e.1 t.1
 pattern2: t.1 '*' e.1 (t.2 e.2) s.1 t.1 e.3 

回答pattern1:

 t.1 = ( 5 + 6 )
 e.1 =  * 7 * ( 5 + ( 4 + 1 ) ) * ( 5 + 6 ) *

回答pattern2:

 t.1 =  ( 5 + 6 )
 e.1 = 7 *
 t.2 = 5
 s.1 = *
 e.2 = + ( 4 + 1 )  
 e.3 =  * ( 5 + 6 )

我正在使用Okasaki CatenableDeque的实现。

0 个答案:

没有答案