aboutsummaryrefslogtreecommitdiff
path: root/src/cljcc/parser.clj
diff options
context:
space:
mode:
authorShagun Agrawal <agrawalshagun07@gmail.com>2024-08-10 11:27:28 +0530
committerShagun Agrawal <agrawalshagun07@gmail.com>2024-08-10 11:27:28 +0530
commita0811a84e381d64069834d5c0097669d66f4b627 (patch)
treeaee0924cfbd8b4e79bf1d441c46eb7e023325695 /src/cljcc/parser.clj
parentb82a214687d0b0f95f98dbd5ba7fefd82012fb85 (diff)
Add parsing and tacky generation for binary operators
Fix grammar to handle left associativity Update parser for binary operators Update tacky generation for binary operators
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;
+ }"))
+
+ ())