https://github.com/miroiu/dw-lang
[Educational] A small interpreted language made from scratch.
https://github.com/miroiu/dw-lang
bigmath editor expression-viewer interpreter lexer netcore3 parser programming-language repl wpf
Last synced: 9 months ago
JSON representation
[Educational] A small interpreted language made from scratch.
- Host: GitHub
- URL: https://github.com/miroiu/dw-lang
- Owner: miroiu
- License: other
- Created: 2019-11-28T12:31:11.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2020-02-04T15:54:41.000Z (almost 6 years ago)
- Last Synced: 2025-02-28T20:34:42.829Z (10 months ago)
- Topics: bigmath, editor, expression-viewer, interpreter, lexer, netcore3, parser, programming-language, repl, wpf
- Language: C#
- Homepage:
- Size: 129 KB
- Stars: 8
- Watchers: 3
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# DwLang Editor

# DwLang
An educational interpreted programming language that works with big numbers.
## Usage from the command line
dwlang -?
## Specifications:
- interpreted language
- execution is single threaded and sequential, all statements are executed in the order they are encountered
Language rules:
- statements are delimited by a semicolon (i.e. ";")
- the decimal separator is comma (i.e. ",")
- empty statements are permitted and ignored during evaluation
- a statement can be written on a single or multiple lines
- spaces between an operator and its operands are optional
Data types:
- a numeric type (BigDecimal)
Variables:
- variable declarations consists of the 'var' keyword followed by the variable's name
- variables name consist exclusively of letters and/or underscore
- variables declaration and initialization can be optionally compound in a single statement (e.g. var a; a = 5; or var a = 5;)
- reserved words of the language can't be used as variable names
- reserved words are: var, sqr, pow, x, prm, avg, med, pwd, set, precision, print, cls
Binary operators:
- \+ -> addition (e.g 2 + 3 = 5)
- \- -> subtraction (e.g 2 - 1 = 1)
- : -> division (e.g 6 : 2 = 3)
- x -> multiplication (e.g 3 x 2 = 6)
- pow -> power (e.g 2 pow 3 = 8)
- prm (permutations without repetitions where n is the number of things to choose
from and we choose r of them, no repetitions, order matters. "n prm r" should evaluate to n!/(n − r)! )
- pwd (number of possible passwords of maximum n characters, made on an alphabet of t
characters. How many passwords of maximum 8 characters can I make using exclusively English letters: that is "52 pwd 8" -> which should be equal to 52 pow 8 + 52 pow 7 + ..... + 52 pow 1)
Unary operators:
- sqr -> square root (e.g sqr 81 = 9)
- ! -> factorial (e.g 4! = 24)
- \- (for negative numbers, e.g. -1)
Commands:
- print (prints to the output stream, e.g. print 2 x 3)
- cls (clears the output stream)
Var args operators:
- avg -> average (e.g. avg 2 3 7 = 4)
- med -> median (e.g. med 2 4 7 8 9 = 7)
Operations grouping:
- parentheses with unlimited nesting depth
Directives:
- set precision (e.g. can be variable or integer: "set precision 4; print 7:6;" should print 1,1667) can be set multiple times in the same program
Errors:
- syntax errors and evaluation errors are printed to the console with their respective line and column numbers
- if an operation has a non-deterministic result, the program should crash (e.g. a non-terminated decimal
expansion)
- attempting to use a variable that was not assigned any value should throw an evaluation error
- evaluation and syntax errors are not fail-fast, meaning that the code will execute until an error is found
Comments:
- anything sourounded by /* and *\ is ignored during evaluation
- if enclosing markers are not balanced, the most outer ones are considered (e.g. "/* some comment *\ print 5; *\ print 3;" should only print 3.)