Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add valid runnable example for readme
- Loading branch information
Roman Gonzalez
committed
Mar 27, 2015
1 parent
c57be58
commit 1b7d6a1
Showing
1 changed file
with
79 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
(ns zetta.examples.clojure | ||
^{:doc "A parser used on this project's README file"} | ||
(:refer-clojure :exclude [char]) | ||
(:require [clojure.core :as core] | ||
[clojure.string :as str] | ||
[clojure.java.io :as io] | ||
[zetta.core | ||
:refer :all] | ||
[zetta.combinators | ||
:as pc] | ||
[zetta.parser.seq | ||
:as pseq] | ||
[zetta.parser.string | ||
:as pstr])) | ||
|
||
(defrecord Actor [name movies]) | ||
(defrecord Doctor [name patients]) | ||
(defrecord Programmer [name programs]) | ||
|
||
(def parse-movie | ||
(do-parser | ||
pseq/skip-spaces | ||
(pstr/take-till #(or (Character/isWhitespace %) | ||
(= % \,))))) | ||
|
||
(def parse-patient | ||
(do-parser | ||
pseq/skip-spaces | ||
first-name <- (pstr/take-till #(Character/isWhitespace %)) | ||
pseq/skip-spaces | ||
last-name <- (pstr/take-till #(or (Character/isWhitespace %) | ||
(= % \,))) | ||
(always [first-name last-name]))) | ||
|
||
(def parse-person-year | ||
(do-parser | ||
pseq/skip-spaces | ||
year <- pseq/number | ||
(if (>= year 1900) | ||
(always year) | ||
(fail-parser "Expecting year to be greater than 1900")))) | ||
|
||
(def parse-program | ||
(do-parser | ||
pseq/skip-spaces | ||
program-year <- parse-person-year | ||
pseq/skip-spaces | ||
(pseq/char \") | ||
program-title <- (pstr/take-till #(= % \")) | ||
(pseq/char \") | ||
(always [program-year program-title]))) | ||
|
||
|
||
(def parse-professional | ||
(do-parser | ||
pseq/skip-spaces | ||
name <- (pstr/take-till #(Character/isSpace %)) | ||
pseq/skip-spaces | ||
profession <- (pstr/take-till #(Character/isSpace %)) | ||
(always [name profession]) | ||
|
||
(cond | ||
(= profession "actor") | ||
(do-parser | ||
movies <- (pc/sep-by1 parse-movie (pseq/char \,)) | ||
(always (Actor. name movies))) | ||
|
||
(= profession "doctor") | ||
(do-parser | ||
patients <- (pc/sep-by1 parse-patient (pseq/char \,)) | ||
(always (Doctor. name patients))) | ||
|
||
(= profession "programmer") | ||
(do-parser | ||
programs <- (pc/sep-by1 parse-program (pseq/char \,)) | ||
(always (Programmer. name programs))) | ||
|
||
:else | ||
(fail-parser (str "Invalid profession: " profession))))) |