From 0f4b96b2b02822abf6f84903366709b1336905a2 Mon Sep 17 00:00:00 2001 From: Shagun Agrawal Date: Sun, 11 Aug 2024 00:22:05 +0530 Subject: Add bitwise operators --- src/cljcc/parser.clj | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/cljcc/parser.clj') diff --git a/src/cljcc/parser.clj b/src/cljcc/parser.clj index bee6d32..0d95ac8 100644 --- a/src/cljcc/parser.clj +++ b/src/cljcc/parser.clj @@ -44,11 +44,38 @@ keyword = #'int\\b' | #'return\\b' | #'void\\b'" :auto-whitespace whitespace)) +(def bitwise-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 + = bitwise-exp-prime | mul-exp | div-exp | mod-exp + mul-exp = mul-div-mod <'*'> bitwise-exp-prime + div-exp = mul-div-mod <'/'> bitwise-exp-prime + mod-exp = mul-div-mod <'%'> bitwise-exp-prime + = bit-and-exp | bit-or-exp | bit-xor-exp | bit-left-shift-exp | bit-right-shift-exp | term + bit-and-exp = bitwise-exp-prime <'&'> term + bit-or-exp = bitwise-exp-prime <'|'> term + bit-xor-exp = bitwise-exp-prime <'^'> term + bit-left-shift-exp = bitwise-exp-prime <'<<'> term + bit-right-shift-exp = bitwise-exp-prime <'>>'> 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)) + (defn parseable? [result] (not (insta/failure? result))) (defn parse [source] - (binop-parser source)) + (bitwise-parser source)) (comment @@ -64,7 +91,7 @@ }") (pp/pprint (parse "int main(void) { - return -(((((10))))); + return 1 & 2 + 6 & 6; }")) (pp/pprint -- cgit v1.2.3