私は単純なtodoリスト言語(TaskPaperからのデータ)を単純なパーサーコンビネータの例として解析するためにfparsecを使用しようとしています。しかし、私は困惑することができないバグに遭遇しました。私はパーサーコンビネータには新しく、FParsecはParsecを知っている私に頼っているようですが、私はparsecのドキュメントを解読できません。 「:」「 - 」 FParsecとデリミタベースの構文
ルールは
- プロジェクトは、で終わる(私は今の@tagsを無視しています)簡単です他のテキスト行は、プロジェクトまたはタスクのプレーンテキストです。
したがって、 "Project 1:\ nSome note \ nProject 2:"という文字列は[ProjectName( "Project 1")としてparseFileから返されます。 NoteText( "Some note"); ProjectName( "Projec 「ProjectName」(「Project 1」)、ProjectName(「Some note \ nProject 2」)]
以下は私のパーサーコードです。
open FParsec.Primitives
open FParsec.CharParsers
type ProjectAst = ProjectName of string
| TaskText of string
| NoteText of string
let asString (x:char list) :string =
x
|> List.map (fun y -> y.ToString())
|> String.concat ""
let makeNote x = NoteText(asString x)
let parseProject =
parse { let! s = many (noneOf ":\n\r\c")
do! skipChar ':'
return ProjectName(asString s) }
let parseTask =
parse { do! skipChar '-'
let! s = many (noneOf "\n\r\c")
return TaskText(asString s) }
let parseNote = many (noneOf "\n\r\c") |>> makeNote
let parseLine = parseTask <|> (attempt parseProject) <|> parseNote
let parseFile = sepBy parseLine (many1 whitespace)
編集構文はHogbayソフトウェアのTaskPaperアプリケーションから構文のTaskPaper website いくつかの例をとっている
Project 1: Description of Project One -task for project 1 -another task for project 1 details for another task -final task Go to store: -buy eggs -buy milk
私はコードを実行し、 '[NoteText" Proje "]'を得ました –
この形式の代表的なサンプルを投稿できますか? –
このコードは大丈夫です。 '\ n'をどこでも(入力を含めて)' \ n 'に置き換え、 'whiteSpace'を' skipChar' * ''で置き換えるのは興味深いでしょう。これは改行問題のようなにおいがします。 – Brian