From edc2d4d19aa5aabd566cd0ac65c5575b78a2e684 Mon Sep 17 00:00:00 2001 From: Vilyaem Date: Fri, 21 Feb 2025 00:38:30 -0500 Subject: [PATCH] First --- README.md | 9 +++++++++ c.sh | 4 ++++ example.txt | 7 +++++++ example2.txt | 5 +++++ main.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ rpcalc | Bin 0 -> 16304 bytes 6 files changed, 80 insertions(+) create mode 100644 README.md create mode 100755 c.sh create mode 100644 example.txt create mode 100644 example2.txt create mode 100644 main.c create mode 100755 rpcalc diff --git a/README.md b/README.md new file mode 100644 index 0000000..3e28d10 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# RPCALC + +This program compiles reverse-polish-notation expressions to x86 16-bit +GNU-Assembly instructions. This is to be an educational supplement to teach +compiler theory. + +## LICENSE + +Public Domain. diff --git a/c.sh b/c.sh new file mode 100755 index 0000000..4e2c6a8 --- /dev/null +++ b/c.sh @@ -0,0 +1,4 @@ +#!/bin/sh +rm rpcalc +cl +cc -O3 -std=c89 -Wall -Wextra -Wmain -Wpedantic -Werror main.c -o rpcalc && ./rpcalc diff --git a/example.txt b/example.txt new file mode 100644 index 0000000..82f3e89 --- /dev/null +++ b/example.txt @@ -0,0 +1,7 @@ +100 +100 ++ +200 +200 ++ +* diff --git a/example2.txt b/example2.txt new file mode 100644 index 0000000..263809f --- /dev/null +++ b/example2.txt @@ -0,0 +1,5 @@ +1000 +3 +* +100 +- diff --git a/main.c b/main.c new file mode 100644 index 0000000..a69127a --- /dev/null +++ b/main.c @@ -0,0 +1,55 @@ +/********************************************* + * Description - RPCalc compiler + * Author - Vilyaem + * Date - Jun 05 2024 + * *******************************************/ + +#include +#include + +char* regnames[] = { "%ax","%bx","%cx","%dx" }; + + +int main(void){ + + int stackptr = 0; + char strbuf[8]; + char regnamebuf[16]; + char regnamebuf2[16]; + + puts("/*Compiled with Vilyaem's simple rpcalc compiler*/"); + + while(fgets(strbuf,8,stdin) != NULL){ + if(strbuf[0] == '\n'){ + break; + } + strbuf[strlen(strbuf)-1] = '\0'; + switch(strbuf[0]){ + case '+': + strcpy(regnamebuf,regnames[stackptr-1]); + strcpy(regnamebuf2,regnames[stackptr-2]); + printf("add %%%s,%%%s\n",regnamebuf,regnamebuf2); + --stackptr; + break; + case '-': + strcpy(regnamebuf,regnames[stackptr-1]); + strcpy(regnamebuf2,regnames[stackptr-2]); + printf("sub %%%s,%%%s\n",regnamebuf,regnamebuf2); + --stackptr; + break; + case '*': + strcpy(regnamebuf,regnames[stackptr-1]); + strcpy(regnamebuf2,regnames[stackptr-2]); + printf("imul %%%s,%%%s\n",regnamebuf,regnamebuf2); + --stackptr; + break; + default: /*assume it is a numeric to be pushed*/ + printf("mv $%s,%%%s\n",strbuf,regnames[stackptr]); + ++stackptr; + break; + } + /*printf("# stackptr: %d", stackptr); for debugging*/ + } + + return 0; +} diff --git a/rpcalc b/rpcalc new file mode 100755 index 0000000000000000000000000000000000000000..8bc46ba9dd3673f363574d2177b404b2886666b4 GIT binary patch literal 16304 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