簡體   English   中英

如何解析 SKI 組合子微積分的左結合記號

[英]How can I parse the left associative notation of SKI combinator calculus

我嘗試了很多東西,它們似乎總是導致以下兩件事之一:

  • 程序永遠掛起(無限左遞歸)
  • 右結合(右遞歸)

我現在唯一的想法是從字符串的末尾而不是開頭進行解析,但是對 haskell 字符串的列表性質進行解析,這需要遍歷每個字符的列表,或者解析反轉的字符串。 這兩個選項聽起來都不錯。

這是我當前代碼中的相關位(這是右關聯的)。 我試過左遞歸,但結果是無限循環。

{-# LANGUAGE PatternGuards #-}

data C = S | K | I deriving (Read,Show,Eq)
data T = N T T | C C deriving Eq

parse :: String -> T
parse s | (e,rest) <- parseStep s = if rest == "" then e else N e (parse rest)

parseStep :: String -> (T,String)
parseStep ('(':s) = parseParen s 
parseStep (c:s) = (C $ read [c],s)

parseParen (c:')':s) = (C $ read [c],s)
parseParen s = parseStep s

由於 luqui 的評論,弄清楚了:

parse :: String -> T
parse = foldTs . parseList

foldTs :: [T] -> T
foldTs (t:ts) = foldl N t ts

parseList :: String -> [T]
parseList "" = []
parseList s = let (x,r) = parseStep s in x:parseList r

parseStep :: String -> (T,String)
parseStep ('(':s) = let (ts,r) = parseParenList s in (foldTs ts,r)
parseStep (c:s) = (C $ read [c],s)


parseParenList :: String -> ([T],String)
parseParenList (')':s) = ([],s)
parseParenList s =
  let
    (x,r) = parseStep s
    (xs,r') = parseParenList r
  in (x:xs,r')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM