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