From a0811a84e381d64069834d5c0097669d66f4b627 Mon Sep 17 00:00:00 2001 From: Shagun Agrawal Date: Sat, 10 Aug 2024 11:27:28 +0530 Subject: 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 --- src/cljcc/parser.clj | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'src/cljcc/parser.clj') 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 - = constant | unop-exp | <'('> 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 + " = function+ + function = #'int\\b' identifier <'('> #'void\\b' <')'> <'{'> statement <'}'> + statement = #'return\\b' exp <';'> + exp = exp-prime + = mul-div-mod | add-exp | sub-exp + add-exp = exp-prime <'+'> mul-div-mod + sub-exp = exp-prime <'-'> 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 + = 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; + }")) + + ()) -- cgit v1.2.3