全て、
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