mirror of
https://github.com/Noratrieb/GRSBPL.git
synced 2026-01-15 20:25:01 +01:00
Add files via upload
This commit is contained in:
commit
99b5e92e1c
2 changed files with 122 additions and 0 deletions
92
README.md
Normal file
92
README.md
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
# GRSBPL - Generic Random Stack Based Programming Language
|
||||||
|
|
||||||
|
uses some form of reverse polish notation
|
||||||
|
|
||||||
|
```
|
||||||
|
1 5 * 5 +
|
||||||
|
> 10
|
||||||
|
```
|
||||||
|
|
||||||
|
There is a stack and variables. Operations are done on the stack, and you can store results in variables (a bit like in
|
||||||
|
the JVM). The stack contains integer values. Floating point numbers are not supported.
|
||||||
|
|
||||||
|
When the program finishes (run to the end of the program), the last value on the stack is returned. If the stack is
|
||||||
|
clear, 0 is always returned. If there is an error during execution, -1 is returned along with an error message to
|
||||||
|
stderr.
|
||||||
|
|
||||||
|
## Operators and keywords:
|
||||||
|
|
||||||
|
* any number `n` -> push the numeric value of n
|
||||||
|
* any character `'c'` -> push c as its escaped ascii value
|
||||||
|
* `+` -> add two values on the stack, pops both and pushes the result
|
||||||
|
* `-` -> subtract two values on the stack, pops both and pushes the result
|
||||||
|
* `*` -> multiply two values on the stack, pops both and pushes the result
|
||||||
|
* `/` -> divide, pops both and pushes the result
|
||||||
|
* `%` -> mod, pops both and pushes the result
|
||||||
|
* `not` -> invert stack value (!=0 -> 0, 0 -> 1)
|
||||||
|
* `swap` -> swaps the 2 top stack values
|
||||||
|
* `out` -> pop and output it to the console as ascii
|
||||||
|
* `nount` -> pop and output as a number to the console
|
||||||
|
* `in` -> push input char as ascii to the stack
|
||||||
|
* `# comment #` text between # is ignored
|
||||||
|
* `# comment\n` text after # is ignored
|
||||||
|
* `&word` -> pop and store it in a variable
|
||||||
|
* `@word` -> load variable and push it, does not consume the variable
|
||||||
|
* `:indent` -> define a label
|
||||||
|
* `goto ident` -> goto a label if the value on the stack is !=0, peek
|
||||||
|
|
||||||
|
Identifier: \w
|
||||||
|
|
||||||
|
Character escape sequences:
|
||||||
|
\n, \r, \\, \0, \', \b, \f
|
||||||
|
|
||||||
|
## Examples:
|
||||||
|
|
||||||
|
FizzBuzz
|
||||||
|
|
||||||
|
```grsbpl
|
||||||
|
1 &i # init loop counter
|
||||||
|
:start # set start label
|
||||||
|
@i 100 - not goto exit # if i is 100, exit
|
||||||
|
@i 15 % not goto print_fizz_buzz # fizzbuzz
|
||||||
|
@i 5 % not goto print_buzz # buzz
|
||||||
|
@i 3 % not goto print_fizz # fizz
|
||||||
|
@i nout '\n' out # normal number
|
||||||
|
:end # go back here after printing
|
||||||
|
@i 1 + &i # increment i
|
||||||
|
1 goto start # go back to the start
|
||||||
|
|
||||||
|
:print_fizz_buzz
|
||||||
|
'F' out 'i' out 'z' out 'z' out 'B' out 'u' out 'z' out 'z' out '\n' out
|
||||||
|
goto end
|
||||||
|
:print_fizz
|
||||||
|
'F' out 'i' out 'z' out 'z' out '\n' out
|
||||||
|
goto end
|
||||||
|
:print_buzz
|
||||||
|
'B' out 'u' out 'z' out 'z' out '\n' out
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:exit 0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Some Tips
|
||||||
|
|
||||||
|
* Increment a variable:
|
||||||
|
`@i 1 + &i`
|
||||||
|
* Pop a value from the stack and discard it:
|
||||||
|
`&dev_null` (just use any unused variable)
|
||||||
|
* Goto if equal
|
||||||
|
`@i 100 - not goto finished`
|
||||||
|
* Goto not equal
|
||||||
|
`@i 100 - goto finished`
|
||||||
|
* Exit the program
|
||||||
|
`... goto exit ... :exit 0`
|
||||||
|
* Exit with exit code depending on the branch
|
||||||
|
```grsbpl
|
||||||
|
...
|
||||||
|
69 swap goto exit # push 69 to the 2nd stack position
|
||||||
|
...
|
||||||
|
5 swap goto exit # push 5 to the 2nd stack position
|
||||||
|
...
|
||||||
|
:exit &del # pop the top stack value to expose the pushed value
|
||||||
|
```
|
||||||
30
pom.xml
Normal file
30
pom.xml
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.github.nilstrieb</groupId>
|
||||||
|
<artifactId>GRSBPL</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<version>5.6.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
<version>5.6.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>14</maven.compiler.source>
|
||||||
|
<maven.compiler.target>14</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue