Ich versuche, eine einfache ToDo-Liste Sprache (die Daten aus Taskpaper tatsächlich) als einfaches Parser combinator Beispiel zu verwenden FParsec zu analysieren. Aber ich bin auf einen Fehler gestoßen, den ich nicht durcheinanderbringen kann. Ich bin neu bei Parser-Kombinatoren und FParsec scheint sich darauf zu verlassen, dass ich Parsec kenne, aber ich finde die Parsec-Dokumentation undurchschaubar.FParsec und ein Begrenzer basierte Syntax
Die Regeln der Aufgabe Papier Sprache sind einfach
- Projekte am Ende mit einem (I @tags für jetzt bin ignorieren) ‚:‘
- Aufgaben werden beginnen mit ‚-‘
- Beliebig andere Textzeile ist eine einfache Textnotiz entweder auf dem Projekt oder eine Aufgabe
so ist die Zeichenfolge „Projekt 1: \ nEinige note \ nProject 2:“ von parseFile als [Projektnamen („Projekt 1“) zurückgeben sollte; NoteText ("Etwas Notiz"); ProjectName ("Projec t 2 ")], aber stattdessen bekomme ich [ProjectName (" Project 1 "); ProjectName (" Etwas Anmerkung \ nProject 2 ")]
Unten ist mein Parser-Code.
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)
Herausgegeben
Die Syntax von Hogbay Software Taskpaper Anwendung TaskPaper website Einige Beispiele für die Syntax genommen wird
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
lief ich den Code und bekam '[Notetext„Proje“]' –
Können Sie einige repräsentative Proben von diesem Format veröffentlichen? –
Dieser Code sieht für mich ok aus. Es wäre interessant, '\ n' durch '*' überall (einschließlich der Eingabe) und 'whiteSpace' durch' skipChar' * ''zu ersetzen, da dies wie ein Newline-Problem riecht. – Brian