From bbac9a9c6e88b098c120f4c9d6798ae0ef3d23df Mon Sep 17 00:00:00 2001 From: Simon Brooke <simon@journeyman.cc> Date: Tue, 10 Feb 2015 22:26:53 +0000 Subject: [PATCH] New work on the parser, based on instaparse. --- project.clj | 1 + src/mw_parser/insta.clj | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/mw_parser/insta.clj diff --git a/project.clj b/project.clj index 4fb0b2a..9615663 100644 --- a/project.clj +++ b/project.clj @@ -13,5 +13,6 @@ :plugins [[lein-marginalia "0.7.1"]] :dependencies [[org.clojure/clojure "1.5.1"] [org.clojure/tools.trace "0.7.8"] + [instaparse "1.3.5"] [mw-engine "0.1.5-SNAPSHOT"] ]) diff --git a/src/mw_parser/insta.clj b/src/mw_parser/insta.clj new file mode 100644 index 0000000..f663861 --- /dev/null +++ b/src/mw_parser/insta.clj @@ -0,0 +1,32 @@ +(ns mw-parser.insta + (:use mw-engine.utils + [clojure.string :only [split trim triml]]) + (:require [instaparse.core :as insta])) + + +(def grammar + "RULE := 'if' SPACE CONDITIONS SPACE 'then' SPACE ACTIONS; + CONDITIONS := CONDITION | CONDITION SPACE 'and' SPACE CONDITIONS; + CONDITION := DISJUNCT-CONDITION | PROPERTY-CONDITION; + DISJUNCT-CONDITION := CONDITION SPACE 'or' SPACE CONDITION; + PROPERTY-CONDITION := PROPERTY SPACE 'is' SPACE EXPRESSION; + EXPRESSION := VALUE QUALIFIER EXPRESSION | VALUE OPERATOR EXPRESSION | VALUE; + QUALIFIER := SPACE 'more' SPACE 'than' SPACE | SPACE 'less' SPACE 'than' SPACE | SPACE 'fewer' SPACE 'than' SPACE | SPACE 'equal' SPACE 'to' SPACE ; + OPERATOR := '+' | '-' | '*' | '/'; + PROPERTY := SYMBOL; + VALUE := SYMBOL | NUMBER; + NUMBER := #'[0-9.]+'; + SYMBOL := #'[a-z]+'; + ACTIONS := ACTION | ACTION SPACE 'and' SPACE ACTIONS + ACTION := SYMBOL SPACE 'should' SPACE 'be' SPACE EXPRESSION + SPACE := #'[:blank:]*'" + ) + +(def rule-parser + (insta/parser grammar)) + +(def token-parser (insta/parser "TOKEN := #'[a-z]+'")) + + + + \ No newline at end of file