0

したがって、「((A o B) a B) o (B a C)」などの論理ステートメントがあり、括弧内のステートメントの各セットをリストの各部分に解析したい...ここに私がいるものがありますこれまでのところ持っていますが、私はhaskellに慣れていないので、私が正しい軌道に乗っているかどうかはわかりません 編集:私は今、これを再び持っています. ということで、今の問題は2点!! (1) 文字列のリストを返すのに問題があります (2) 今実行すると予期しない '(' が返されます

statement :: Parser String
statement =  many (letter <|> space ) >> parenStatement

parenStatement :: Parser [String]
parenStatement = do
    char '('
    answer <- statement
    char ')'
    return answer
4

1 に答える 1

3

おそらく、論理ステートメントを表す何らかのデータ型があるとします。

data Statement = Conjunction Statement Statement
               | Disjunction Statement Statement
               -- etc

おそらく、最終的には論理ステートメントを解析できるようにしたいでしょう。

statement :: Parser Statement
statement = conjunction <|> disjunction <|> parenthesisisedStatement -- etc

括弧で囲まれたステートメントの解析は、次のとおりです。

parenthesisisedStatement :: Parser Statement
parenthesisisedStatement = do
    char '('
    answer <- statement
    char ')'
    return parenthesisisedStatement

編集:(これはコメントに収まらないため)

入力文字列を文字列のリストにトークン化しようとしているようです (後でパーサーにフィードする可能性があります)。入力文字列を、その内容を適切に制約するデータ構造に解析しようとしているようには見えません。

本当に入力をトークン化したい場合は、新しいトップレベルの質問で再度質問することをお勧めします。

しかし、おそらく入力を適切なデータ構造に解析したほうがよいので、ステートメントを表現する最善の方法を検討しあらゆる場所で文字列を使用しないでください

于 2013-04-23T19:11:19.680 に答える