演習/楽しいプロジェクトとして、Haskell でブレイン インタープリターを作成しようとしていますが、少し問題が発生しました。
Brainfuck の "while ループ" 構造は、一連のコマンドを括弧で囲んだだけです。[
データコンストラクター内のループ内に演算子を格納する方法で構文ツリーを構築しようとしています。
これは、コマンドと構文「ツリー」のデータ宣言が現時点でどのように見えるかです。
data Operator = Plus
| Minus
| RShift
| LShift
| Dot
| Comma
| SBracket [Operator]
| EBracket
deriving (Show, Eq)
type STree = [Operator]
私がやろうとしているのは、次のようString
なコマンドを取得して、次のよう"+><[.>]"
に解析することSTree
です。
[Plus, RShift, LShift, SBracket [Dot, RShift], EBracket]
これまでのところ、 から 1 次元のリストしか取得できません。新しい演算子を の代わりに演算子リストに入れるためにString
、リストの先頭が であるかどうかを確認する方法がわからないためです。SBracket
メインリストの先頭。
解析を行うために使用している関数は次のとおりです。
matchChar :: Char -> Maybe Operator
matchChar c = case c of
'+' -> Just Plus
'-' -> Just Minus
'>' -> Just RShift
'<' -> Just LShift
'.' -> Just Dot
',' -> Just Comma
'[' -> Just (SBracket [])
']' -> Just EBracket
_ -> Nothing
getChars :: [Char] -> STree
getChars str = foldr toOp [] str
where
toOp x acc = case matchChar x of
Just a -> a:acc
Nothing -> acc
私ができるようにしたいのhead acc
は、 がSBracket
インスタンスであるかどうかを確認することです。そうであれば、 newOperator
をリストに追加する代わりに、SBracket
のリストに追加しOperator
ます。
パターン マッチング ( toOp x ((SBracket list):xs) = ...
) とリストの先頭の明示的なif head acc == SBracket ...
チェック ( ) を試しましたが、どちらも正しく動作しません。
どんな助けでも素晴らしいでしょう!