New work on the parser, based on instaparse.
This commit is contained in:
parent
dddeea6041
commit
bbac9a9c6e
|
@ -13,5 +13,6 @@
|
||||||
:plugins [[lein-marginalia "0.7.1"]]
|
:plugins [[lein-marginalia "0.7.1"]]
|
||||||
:dependencies [[org.clojure/clojure "1.5.1"]
|
:dependencies [[org.clojure/clojure "1.5.1"]
|
||||||
[org.clojure/tools.trace "0.7.8"]
|
[org.clojure/tools.trace "0.7.8"]
|
||||||
|
[instaparse "1.3.5"]
|
||||||
[mw-engine "0.1.5-SNAPSHOT"]
|
[mw-engine "0.1.5-SNAPSHOT"]
|
||||||
])
|
])
|
||||||
|
|
32
src/mw_parser/insta.clj
Normal file
32
src/mw_parser/insta.clj
Normal file
|
@ -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]+'"))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue