From fd0d489fbf81733688d675317315cfa3dcd1b976 Mon Sep 17 00:00:00 2001 From: Nayan Sawyer <33187059+GShadow5@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:52:26 -0500 Subject: [PATCH] Update README.md --- README.md | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 256ff38..523a7de 100644 --- a/README.md +++ b/README.md @@ -1 +1,97 @@ -# pmpv-python \ No newline at end of file +# Simple command line PMPV calculator in Python +Author: Robert (Nayan) Sawyer\ +Date: Jan 24 2024 + +### Description +A simple command line calculator that supports addition, +subtraction, variables, and parentheses. This program was +written for a homework assignment for COS 301: Programming +Languages at the University of Maine taught by Sudarshan S. +Chawathe. + +### Language specification +This assignment had intentionally vague instructions, however, +I wrote my code to the following specifications: +- The code accepts mathematical expressions that include plus, +minus, variables, and parentheses (PMPV) +- Variable names must meet python's criteria of letters, +underscores, and numbers, so long as they don't start with a +number. +- Numbers must be positive or negative integers +- Negative integers must be preceded by a space ' ' or an open +paranthesis '(' +- Consecutive operators, dangling operators at the beginning or +end of an expression, undefined variables, and mismatched +parentheses are invalid syntax +#### Terminals and Backus-Naur Form +Terminals are numbers and identifiers (variable names), and +['=', '+', '-', '(', ')'] +``` +BNF: + ::= | + ::= identifier = + ::= + | + - | + + ::= () | identifier | number +``` + +### Input examples +``` +input output +3 + 5 - -2 - 2 8 +x = 3 + 5 - -2 - 2 +y = x - (x - 2) +y 2 +ans = (17 - (5 - 20)) - (1 - 11) +ans 42 + +ans = ans - (-42 - ans) +ans 126 +(17-(5-20))-(1-11) 42 +``` + +### How to run +You can run the program interactively with the command \ +`python pmpv.py` \ +Alternatively, you can pipe files in and out. +On linux that can be acheived with the arrow operator\ +`python pmpv.py < in.txt` or `python pmpv.py < in.txt > out.txt`\ +On windows output redirection works the same way, but you need to +use piping for input redirection. It is the same in essence, but a +little more clunky\ +`Get-Content in.txt | python pmpv.py > out.txt` + +### Dependencies +This program uses python's built-in re module (regex), and there +are no external dependencies + +### Diagnostics +The program sends error messages to stderr, so you can redirect +that away if you don't want those messages. + +### Bugs and limitations +Typical behaviour is to ignore invalid inputs and send a warning +to stderr. It is possible for the program to crash or throw an +exception, but I have tested it extensively, and crashes during +normal use are *hopefully* rare. + +One issue with the program is that behaviour when given invalid +input undefined. Some inputs will be ignored, but there may be +some cases where the input is invalid, but the program interprets +it anyway, and may give a mathematically incorrect result. + + +### Sources used: +- https://regexr.com/ +- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Cheatsheet +- https://www.delftstack.com/howto/python/python-print-to-stderr/ +- https://stlab.cc/legacy/how-to-write-a-simple-lexical-analyzer-or-parser.html +- https://www.tutorialsteacher.com/python/public-private-protected-modifiers +- https://stackoverflow.com/questions/1155617/count-the-number-of-occurrences-of-a-character-in-a-string +- https://stackoverflow.com/questions/152580/whats-the-canonical-way-to-check-for-type-in-python +- https://www.geeksforgeeks.org/python-method-overloading/ +- https://docs.python.org/3/library/functions.html#iter (for info on iter) +- https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner +- https://stackoverflow.com/questions/11447598/redirecting-standard-input-output-in-windows-powershell +- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_pipelines?view=powershell-7.4