aboutsummaryrefslogtreecommitdiff
path: root/src/cljcc/parser.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/cljcc/parser.clj')
-rw-r--r--src/cljcc/parser.clj46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/cljcc/parser.clj b/src/cljcc/parser.clj
index 8852d91..bee6d32 100644
--- a/src/cljcc/parser.clj
+++ b/src/cljcc/parser.clj
@@ -1,6 +1,7 @@
(ns cljcc.parser
(:require
- [instaparse.core :as insta]))
+ [instaparse.core :as insta]
+ [clojure.pprint :as pp]))
(def whitespace
(insta/parser
@@ -14,11 +15,32 @@
function = #'int\\b' identifier <'('> #'void\\b' <')'> <'{'> statement <'}'>
statement = #'return\\b' exp <';'>
exp = exp-prime
- <exp-prime> = constant | unop-exp | <'('> exp-prime <')'>
+ <exp-prime> = <'('> exp-prime <')'> | unop-exp | constant-exp
unop-exp = unop exp
unop = #'-' | #'~'
identifier = #'[a-zA-Z_]\\w*\\b'
- constant = #'[0-9]+\\b'
+ constant-exp = #'[0-9]+\\b'
+ keyword = #'int\\b' | #'return\\b' | #'void\\b'"
+ :auto-whitespace whitespace))
+
+(def binop-parser
+ (insta/parser
+ "<program> = function+
+ function = #'int\\b' identifier <'('> #'void\\b' <')'> <'{'> statement <'}'>
+ statement = #'return\\b' exp <';'>
+ exp = exp-prime
+ <exp-prime> = mul-div-mod | add-exp | sub-exp
+ add-exp = exp-prime <'+'> mul-div-mod
+ sub-exp = exp-prime <'-'> mul-div-mod
+ <mul-div-mod> = term | mul-exp | div-exp | mod-exp
+ mul-exp = mul-div-mod <'*'> term
+ div-exp = mul-div-mod <'/'> term
+ mod-exp = mul-div-mod <'%'> term
+ <term> = constant-exp | unary-exp | <'('> exp-prime <')'>
+ unary-exp = unary-operator term
+ unary-operator = #'-' | #'~'
+ identifier = #'[a-zA-Z_]\\w*\\b'
+ constant-exp = #'[0-9]+\\b'
keyword = #'int\\b' | #'return\\b' | #'void\\b'"
:auto-whitespace whitespace))
@@ -26,7 +48,7 @@
(not (insta/failure? result)))
(defn parse [source]
- (c-parser source))
+ (binop-parser source))
(comment
@@ -41,6 +63,20 @@
return -(((((10)))));
}")
- (parse "int main(void) {
+ (pp/pprint (parse "int main(void) {
return -(((((10)))));
}"))
+
+ (pp/pprint
+ (binop-parser
+ "int main(void) {
+ return -1 * 2 - ~3 * -(-4 + 5);
+ }"))
+
+ (pp/pprint
+ (binop-parser
+ "int main(void) {
+ return -2;
+ }"))
+
+ ())