371 lines
9.1 KiB
Markdown
371 lines
9.1 KiB
Markdown
# 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
|