2

全て、

parsec を使用してパーサーを作成しようとしています。目標は、最終的におもちゃの言語を解析できるようにすることです。

現在、parsec に 2 つの異なるオプション (代入と関数呼び出しなど) を認識させるのに苦労しています。

以下を解析する「parseCode」関数をどのように記述しますか。

x = 3
y = 4
plus(x,y)

の中へ:

(Assignment "x" "3")
(Assignment "y" "4")
(Invocation "plus" ["x","y"])

ありがとう

編集:

** 簡潔にするために省略 **

編集2:

私はあなたの提案に基づいて少し構築しましたが、現在、次の問題があります。実行parse parseTester "bla" "{plus(3,4)\nmin(2,3)\nx=3\n"すると、予想される解決策が得られますRight (Body [Invocation "plus",Invocation "min",Assignment "x" "3"])

しかし、機能的に (ほぼ) 同等のものを実行するparse parseBody "bla" "{plus(3,4)\nmin(2,3)\nx=3\n}"と、エラーが発生します。

Left "bla" (line 4, column 2):
unexpected end of input
expecting white space or "="

問題がわかりません。パーサーは、呼び出しを探すべき場所で、割り当てを突然探していますか? 助言がありますか?

コード:

data Body = Body [Statement]
    deriving (Show)

data Arguments = Arguments [String]
    deriving (Show)

data Statement = Assignment String String
               | Invocation String
    deriving (Show)


parseBody :: Parser Body
parseBody = do
    char '{'
    statements <- many1 parseStatement
    char '}'
    return $ Body statements

parseTester :: Parser Body
parseTester = do 
    char '{'
    x <- many1 parseStatement
    return $ Body x

parseStatement :: Parser Statement
parseStatement = do
        x <- try parseInvocation <|> parseAssignment <?> "statement"
        return x

parseInvocation :: Parser Statement
parseInvocation = do
    spaces
    name <- many1 (noneOf " (")
    spaces
    char '('
    spaces
    bla <- many1 (noneOf " )")
    spaces
    char ')'
    char '\n'
    return $ Invocation name

parseAssignment :: Parser Statement
parseAssignment = do
    spaces
    var <- many1 (noneOf " =")
    spaces
    char '=' <?> "equal in assignment"
    spaces
    value <- many1 (noneOf "\n")
    char '\n'
    spaces
    return $ Assignment var value
4

1 に答える 1