Screen-Savers/readme.md

371 lines
9.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# YTD Graphing Language
*Implementation still in progress.*
## Lexical Definition
### Comments
Comments can either be single-line comments or multi-line comments.
Single-line comments start with `#` and end at the end of a line.
### Identifiers
Can be up to 31 characters in length, and are case sensitive.
They cannot be a keyword.
```
Identifier ::= ID_Start*
ID_Start ::= <Any latin alphabet ligature: "A"-"Z", "a"-"z">
```
### Keywords
Keywords are not case sensitive.
```
screen graph anim const
sum pi alpha beta
theta inf product integral
```
### Literals
```
number ::= decinteger | pointfloat | exponentfloat
decinteger ::= nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*
nonzerodigit ::= "1"..."9"
digit ::= "0"..."9"
pointfloat ::= ([digitpart] fraction) | (digitpart ".")
exponentfloat ::= (digitpart | pointfloat) exponent
digitpart ::= digit (["_"] digit)*
fraction ::= "." digitpart
exponent ::= ("e" | "E") ["+" | "-"] digitpart
```
### Punctuation
```
+ - * / % ^
= ! < <= > >=
{ } [ ] ( )
_ -> , ; : ∑
∏ ∞ ≠ ≤ ≥ ∫
α β π → θ
```
#### Punctuation Conversions
| Original | New |
| -- | -- |
| <= | ≤ |
| >= | ≥ |
| -> | → |
#### Keyword Conversions
| Original | New |
| -- | -- |
| sum | ∑ |
| pi | π |
| alpha | α |
| beta | β |
| inf | ∞ |
| product | ∏ |
| integral | ∫ |
| theta | θ |
## Syntax
The syntactical structure starts with a `file` at the root.
### File
A `file` can contain any number of the following elements:
- *Screen*
- *Graph*
- *Animation*
- *Constant*
<!-- - *Image* -->
### Screen
A *screen* begins with the `screen` keyword. It then has a comma (`,`)
separated list enclosed in curly braces (`{` and `}`) of *screen parameters*.
At most only one screen block is allowed per `file`.
#### Screen parameter
A *screen parameter* begins with its parameter name then a colon (`:`) followed
by its value.
Listed bellow are the possible parameters.
**Top**
- Role:
Sets the Y-Coordinate of the top of the screen to the given value.
- Required:
False
- Default:
`Unset`
- Possible Values: Integers, `Unset`
**Bottom**
- Role:
Sets the Y-Coordinate of the bottom of the screen to the given value.
- Required:
False
- Default:
`Unset`
- Possible Values: Integers, `Unset`
**Right**
- Role:
Sets the X-Coordinate of the right of the screen to the given value.
- Required:
False
- Default:
`Unset`
- Possible Values: Integers, `Unset`
**Left**
- Role:
Sets the X-Coordinate of the left of the screen to the given value
- Required:
False
- Default:
`Unset`
- Possible Values: Integers, `Unset`
**Width**
- Role:
Sets the X-Coordinate range of the screen to the given value
- Required:
False
- Default:
`Unset`
- Possible Values: Natural Numbers, `Unset`
- Note:
Centered on zero if `right` and `left` are unset.
The range uses `right` or `left` if one is set.
Has no affect if `right` and `left` are set.
**Height**
- Role:
Sets the Y-Coordinate range of the screen to the given value
- Required:
False
- Default:
`Unset`
- Possible Values: Natural Numbers, `Unset`
- Note:
Centered on zero if `top` and `bottom` are unset.
The range uses `top` or `bottom` if one is set.
Has no affect if `top` and `bottom` are set.
**Width Scale**
- Role:
Sets the X-Coordinate range of the screen to the screen pixel
width divided by the given value
- Required:
False
- Default:
`20`
- Possible Values: Positive Real Numbers
- Note:
Centered on zero if `right` and `left` are unset.
Has no affect if `right` and `left` are set or if `width` is set.
**Height Scale**
- Role:
Sets the Y-Coordinate range of the screen to the screen pixel
height divided by the given value
- Required:
False
- Default:
`20`
- Possible Values: Positive Real Numbers
- Note:
Centered on zero if `top` and `bottom` are unset.
Has no affect if `top` and `bottom` are set or if `height` is set.
**FPS**
- Role:
Sets the refresh rate of the screen
- Required:
False
- Default:
`30`
- Possible Values: Natural Numbers
### Graph
A *graph* begins with the `graph` keyword. It then has a comma (`,`)
separated list enclosed in curly braces (`{` and `}`) of *graph parameters*.
A graph block defines a graph to be drawn.
#### Graph parameter
A *graph parameter* begins with its parameter name then a colon (`:`) followed
by an `expression`.
Listed bellow are the possible parameters and their possible roles.
Any ranges can be the `identifier` of an *animation* or an *inline animation*.
**X**
- The `x = f(y)` function for `y` independent cartesian equations.
- The `x = f(t)` function for parametric equations.
- The `x` range (animation) for `x` independent cartesian equations.
**Y**
- The `y = f(x)` function for `x` independent cartesian equations.
- The `y = f(t)` function for parametric equations.
- The `y` range (animation) for `y` independent cartesian equations.
**T**
- The `t` range (animation) for parametric equations.
**R**
- The `r = f(θ)` function for polar equations.
**θ**
- The `θ` range (animation) for polar equations.
*Color functions*
- The `c = f(x)` function for `x` independent cartesian equations.
- The `c = f(y)` function for `y` independent cartesian equations.
- The `c = f(t)` function for parametric equations.
- The `c = f(θ)` function for polar equations.
#### Color Functions
*Color function* parameter names are **C_x** where the *x* is color space part
subscript.
Only one color space can be used in each graph.
If only alpha is set the default color space is **Grey-scale**.
Listed bellow are the available color spaces and their subscripts.
Default value in parenthesis for the unused subscripts of the color spaces.
- **Grey-scale**: `w`, `a` - Grey-scale (1), Alpha (1)
- **RGB**: `r`, `g`, `b`, `a` - Red (0), Green (0), Blue (0), Alpha (1)
- **HSL**: `h`, `s`, `l`, `a` - Hue (0), Saturation (1), Luminosity (0.5),
Alpha (1)
All values can be a real number between 0 and 1 inclusive.
Values bellow this range will be interpreted as 0.
Values above this range will be interpreted as 1.
### Animation
An *animation* begins with the `anim` keyword. Unless it is an
*inline animation* block, the keyword is followed by its `identifier`. It then
has a comma (`,`) separated list enclosed in curly braces (`{` and `}`)
of *animation parameters*.
When an animation is used in an expression, the value it is evaluated as is in
the range defined, changing by the step every frame.
#### Animation parameter
An *animation parameter* begins with its parameter name then a colon (`:`)
followed by an `expression`. If it is the only parameter the parameter name for
the range is optional.
Listed bellow are the possible parameters. Only the *range* parameter is
required.
**R** Range: `R:` *expression* `≤ x ≤` *expression*
**S** Step: `S:` *expression*
- Default is `1/10` unless a range expression is multiplied by `π` then it
is `π/32`.
**D** Direction: `D:` *direction*
- `increase` (default)
- `decrease`
- `bounce`
#### Constant
A *constant* begins with the `const` keyword. It then is followed by an
identifier, the assignment operator (`=`) followed by an `expression` then
ended with a semicolon (`;`).
### Expressions
#### Unary Expression
A `unary expression` is made up of one `expression` and one `unary operator`.
The operator may come before or after the expression.
#### Binary Expression
A `binary expression` is made up of one `expression`, then one
`binary operator`, then another `expression`.
#### Function
A `function` starts with an `identifier` followed by a comma (`,`)
separated list enclosed in parentheses (`(` and `)`) of *function arguments*.
##### Function Argument
A *function argument* is an `expression`.
#### Enclosed Expression
An `enclosed expression` is simply an `expression` enclosed in parentheses
(`(` and `)`).
#### Operator
Here are all operators and their types and names in order of precedence.
| Operator | Type | Name |
| -- | -- | -- |
| `-` | Unary (Prefix) | Negate *Operator* |
| `!` | Unary (Postfix) | Factorial *Operator* |
| `^` | Binary | Exponential *Operator* |
| `_` | Binary | Subscript *Operator* |
| `/` | Binary | Division *Operator* |
| `%` | Binary | Modulus *Operator* |
| `*` | Binary | Multiplication *Operator* |
| `-` | Binary | Subtraction *Operator* |
| `+` | Binary | Addition *Operator* |
| `=` | Binary | Assignment *Operator* |
**Note**: The assignment operator (`=`) can only be used in a *Constant*
#### Literal
A `literal` is just simply the content of the literal.
#### Identifier
A `identifier` is just simply the name of the identifier.
## Semantics
### Screen Block
### Graph Block
<!-- ### Image Block
Defines a background image.
Additional image blocks will stack on top of the previous one in the order they
are in the file.
- **X**: The `x` range (animation) for the background.
- **Y**: The `y` range (animation) for the background.
- **R**: The `r` range (animation) for the background.
- **A or Theta**: The `theta` range (animation) for the background.
- **C_x**: The color function of the background. -->
### Animation Block