Add syntax highlighting to spec pages

master
Araozu 2024-07-25 08:49:24 -05:00
parent 771a4b7044
commit 76aad9cd8a
7 changed files with 47 additions and 41 deletions

View File

@ -4,7 +4,7 @@ import PagesLayout from "./PagesLayout.astro";
const { frontmatter, headings } = Astro.props; const { frontmatter, headings } = Astro.props;
const posts = await Astro.glob("../pages/spec/**/*.{md,mdx}"); const posts = await Astro.glob("../pages/spec/**/*.{md,mdx}");
const indexSubpath = `/spec/index.md`; const indexSubpath = `/spec/index.mdx`;
--- ---
<PagesLayout <PagesLayout

View File

@ -20,6 +20,7 @@ pagesLayout:
- path: ast - path: ast
- path: expression - path: expression
--- ---
import Code from "../../components/Code.astro"
# The THP Language Specification # The THP Language Specification
@ -100,11 +101,11 @@ greater than before, it emits a Indent token. If it's lower, emits a Dedent toke
if it's the same it does nothing. if it's the same it does nothing.
```thp <Code thpcode={`
1 + 2 1 + 2
+ 3 + 3
+ 4 + 4
``` `} />
The previous code would emit the following tokens: `1` `+` `2` `NewLine` `Indent` `+` `3` `NewLine` The previous code would emit the following tokens: `1` `+` `2` `NewLine` `Indent` `+` `3` `NewLine`
`+` `4` `Dedent` `+` `4` `Dedent`
@ -114,12 +115,12 @@ Additionaly, it is a lexical error to have wrong indentation. The lexer stores a
previous indentation levels in a stack, and reports an error if a decrease in indentation previous indentation levels in a stack, and reports an error if a decrease in indentation
doesn't match a previous level. doesn't match a previous level.
```thp <Code thpcode={`
if true { // 0 indentation if true { // 0 indentation
print() // 4 indentation // print() // 4 indentation
print() // 2 indentation. Error. There is no 2-indentation level // print() // 2 indentation. Error. There is no 2-indentation level
} }
``` `} />
All productions of the grammar ignore whitespace/indentation, except those involved in All productions of the grammar ignore whitespace/indentation, except those involved in
semicolon inference. semicolon inference.
@ -134,26 +135,26 @@ Statements in THP end when a new line is encountered:
```thp <Code thpcode={`
// The statement ends | here, on the newline // The statement ends | here, on the newline
val value = (123 + 456) * 0.75 val value = (123 + 456) * 0.75
``` `} />
```thp <Code thpcode={`
// Each line contains a different statement. They all end on their new lines // Each line contains a different statement. They all end on their new lines
var a = 1 + 2 // a = 3 var a = 1 + 2 // a = 3
+ 3 // this is not part of `a`, this is a different statement + 3 // this is not part of \`a\`, this is a different statement
``` `} />
This is true even if the line ends with an operator: This is true even if the line ends with an operator:
```thp <Code thpcode={`
// These are still different statements // These are still different statements
var a = 1 + 2 + // This is now a compile error, there is a hanging `+` var a = 1 + 2 + // This is now a compile error, there is a hanging `+`
3 // This is still a different statement 3 // This is still a different statement
``` `} />
### Parenthesis ### Parenthesis
@ -161,16 +162,16 @@ var a = 1 + 2 + // This is now a compile error, there is a hanging `+`
Exception 1: When a parenthesis is open, all following whitespace is ignored Exception 1: When a parenthesis is open, all following whitespace is ignored
until the closing parenthesis. until the closing parenthesis.
```thp <Code thpcode={`
// open parenthesis found, all whitespace is ignored until the closing // open parenthesis found, all whitespace is ignored until the closing
name.contains( name.contains(
"weird" "weird"
) )
``` `} />
However, for a parenthesis to begin to act, it needs to be open on the same line. However, for a parenthesis to begin to act, it needs to be open on the same line.
```thp <Code thpcode={`
// Still 2 statements, because the parenthesis is in a new line // Still 2 statements, because the parenthesis is in a new line
print print
( (
@ -181,7 +182,7 @@ print
print( print(
"hello" "hello"
) )
``` `} />
### Indented binary operator ### Indented binary operator
@ -189,22 +190,22 @@ Exception 2:
- When a binary operator is followed by indentation: - When a binary operator is followed by indentation:
```thp <Code thpcode={`
val sum = 1 + 2 + // The line ends with a binary operator val sum = 1 + 2 + // The line ends with a binary operator
3 // There is indentation 3 // There is indentation
``` `} />
- Or when indentation is followed by a binary operator: - Or when indentation is followed by a binary operator:
```thp <Code thpcode={`
val sum = 1 + 2 val sum = 1 + 2
+ 3 // Indentation and a binary operator + 3 // Indentation and a binary operator
``` `} />
In theses cases, all whitespace will be ignored In theses cases, all whitespace will be ignored
until the indentation returns to the initial level. until the indentation returns to the initial level.
```thp <Code thpcode={`
// This method chain is a single statement because of the indentation // This method chain is a single statement because of the indentation
val person = PersonBuilder() val person = PersonBuilder()
.set_name("john") .set_name("john")
@ -215,6 +216,6 @@ val person = PersonBuilder()
// Here indentation returns, and a new statement begins // Here indentation returns, and a new statement begins
print(person) print(person)
``` `} />

View File

@ -2,6 +2,7 @@
layout: ../../../layouts/SpecLayout.astro layout: ../../../layouts/SpecLayout.astro
title: Comment title: Comment
--- ---
import Code from "../../../components/Code.astro"
# Comment # Comment
@ -9,8 +10,8 @@ title: Comment
Comment = "//", any_except_new_line Comment = "//", any_except_new_line
``` ```
```thp <Code thpcode={`
// This is a comment // This is a comment
// //
// Another // comment // Another // comment
``` `} />

View File

@ -2,6 +2,7 @@
layout: ../../../layouts/SpecLayout.astro layout: ../../../layouts/SpecLayout.astro
title: Identifiers & Datatypes title: Identifiers & Datatypes
--- ---
import Code from "../../../components/Code.astro"
# Identifiers & Datatypes # Identifiers & Datatypes
@ -18,13 +19,13 @@ Identifier = (underscore | lowercase_letter), identifier_letter*
identifier_letter = underscore | lowercase_letter | uppercase_letter | decimal_digit identifier_letter = underscore | lowercase_letter | uppercase_letter | decimal_digit
``` ```
```thp <Code thpcode={`
identifier identifier
_identifier _identifier
_123 _123
_many_letters _many_letters
camelCase camelCase
``` `} />
## Datatype ## Datatype
@ -33,20 +34,20 @@ camelCase
Datatype = uppercase_letter, indentifier_letter* Datatype = uppercase_letter, indentifier_letter*
``` ```
```thp <Code thpcode={`
Datatype Datatype
PDO PDO
WEIRD_DATATYPE WEIRD_DATATYPE
``` `} />
## Keywords ## Keywords
The following are (currently) THP keywords: The following are (currently) THP keywords:
```thp <Code thpcode={`
val var fun val var fun
``` `} />
Keywords are scanned first as identifiers, then transformed Keywords are scanned first as identifiers, then transformed
to their respective tokens. to their respective tokens.

View File

@ -2,6 +2,7 @@
layout: ../../../layouts/SpecLayout.astro layout: ../../../layouts/SpecLayout.astro
title: Numbers title: Numbers
--- ---
import Code from "../../../components/Code.astro"
# Numbers # Numbers
@ -15,12 +16,12 @@ hexadecimal_number = "0", ("x" | "X"), hexadecimal_digit+
decimal_number = decimal_digit+ decimal_number = decimal_digit+
``` ```
```thp <Code thpcode={`
12345 12345
01234 // This is a decimal number, not an octal number 01234 // This is a decimal number, not an octal number
0xff25 0xff25
0XFfaA 0XFfaA
``` `} />
`TODO`: Implement octal `0o777` and binary `0b0110`. `TODO`: Implement octal `0o777` and binary `0b0110`.
@ -36,14 +37,14 @@ Float = decimal_number, ".", decimal_number+, scientific_notation?
scientific_notation = "e", ("+" | "-"), decimal_number scientific_notation = "e", ("+" | "-"), decimal_number
``` ```
```thp <Code thpcode={`
123.456 123.456
123.456e+4 123.456e+4
123.456e-2 123.456e-2
123e+10 123e+10
123e-3 123e-3
``` `} />
All floating point numbers must start with at least 1 digit. All floating point numbers must start with at least 1 digit.

View File

@ -2,6 +2,7 @@
layout: ../../../layouts/SpecLayout.astro layout: ../../../layouts/SpecLayout.astro
title: Operator title: Operator
--- ---
import Code from "../../../components/Code.astro"
# Operator # Operator
@ -14,9 +15,9 @@ operator_char = "+" | "-" | "=" | "*" | "!" | "/" | "|"
| "<" | ">" | "^" | "." | ":" | "<" | ">" | "^" | "." | ":"
``` ```
```thp <Code thpcode={`
+ - / * % < > <= >= -> => + - / * % < > <= >= -> =>
``` `} />
These are all the characters that can make an operator. These are all the characters that can make an operator.

View File

@ -2,6 +2,7 @@
layout: ../../../layouts/SpecLayout.astro layout: ../../../layouts/SpecLayout.astro
title: String title: String
--- ---
import Code from "../../../components/Code.astro"
# String # String
@ -19,11 +20,11 @@ escape_seq = "\n"
string_char = any_unicode_except_newline_and_double_quote string_char = any_unicode_except_newline_and_double_quote
``` ```
```thp <Code thpcode={`
"hello" "hello"
"" ""
"it's me" "it's me"
"\"Mario\"" "\\"Mario\\""
``` `} />
`TODO`: String interpolation `TODO`: String interpolation