docs: update annotation syntax definitions

This commit is contained in:
2026-07-08 14:43:10 +02:00
parent 6740344eba
commit e0a468a2c2
2 changed files with 71 additions and 68 deletions

View File

@@ -1,20 +1,8 @@
identifier ::= '[a-zA-Z][a-zA-Z_]*' Identifier ::= '[a-zA-Z][a-zA-Z_]*'
integer ::= '\d+' TypeArgs ::= "[" (Type ("," Type)*)? "]"
number ::= integer ["." integer]
boolean ::= "False" | "True"
none ::= "None"
value ::= number | boolean | none FrameColumn ::= ((Identifier | "_") ":")? Type
lambda-value ::= "_" | value FrameSchema ::= "[" (FrameColumn ("," FrameColumn)*)? "]"
lambda-operator ::= ">" | "<" | ">=" | "<=" | "==" | "!="
lambda ::= lambda-value lambda-operator lambda-value
constraint ::= identifier | "(" lambda ")" Type ::= "Frame" FrameSchema | Identifier TypeArgs?
base-type ::= identifier
type ::= base-type { "+" constraint }
column-type ::= type | "_"
column-def ::= [ identifier ":" ] column-type
frame-def ::= column-def { "," column-def }

View File

@@ -1,64 +1,72 @@
#import "@preview/fervojo:0.1.1": render #import "@preview/fervojo:0.1.1": default-css, render
#let value = ``` #let extra-css = ```css
{[`value` < svg.railroad .terminal rect {
[`number` 'digit' * ! <!, ["." 'digit' * !]>], fill: #F7DCD4;
[`boolean` <"False", "True">], }
[`none` "None"] ```
#let css = default-css() + bytes(extra-css.text)
#let type-args = ```
{[`type-args` "[" <!, 'type'*","> "]"]}
```
#let frame-schema = ```
{[`frame-schema` "[" <!, [[<'identifier', "_"> ":"]? 'type']*","> "]"]}
```
#let type = ```
{[`type` <
["Frame" 'frame-schema'],
['identifier' <!, 'type-args'>]
>]} >]}
``` ```
#let constraint = ```
{[`constraint` <"_", 'value'> <">", "<", ">=", "<=", "==", "!="> <"_", 'value'>]}
```
#let type-with-constraints = ```
{[`type-with-constraints` 'identifier' <!, ["+" "(" 'constraint' ")"] * !>]}
```
#let column-def = ```
{[`column-def` <!, ['identifier' ":"]> <"_", 'type-with-constraints'>]}
```
#let frame-def = ```
{[`frame-def` 'column-def' * ","]}
```
#let annotation = ```
{[`annotation` 'identifier' <!, ["[" 'frame-def' "]"]>]}
```
#let rules = ( #let rules = (
value, type-args: type-args,
constraint, frame-schema: frame-schema,
type-with-constraints, type: type,
column-def, )
frame-def,
annotation, #let inline = (
"type-args",
"frame-schema",
) )
#set text(font: "Source Sans 3") #set text(font: "Source Sans 3")
= Type annotation syntax #title[Supported Python annotation syntax]
#for rule in rules { = Outline
render(rule)
}
/* #box(
#let by-name = ( columns(
annotation: annotation, 2,
frame-def: frame-def, outline(title: none),
column-def: column-def, ),
type-with-constraints: type-with-constraints, height: 9cm,
constraint: constraint, stroke: 1pt,
value: value, inset: 1em,
) )
= Statements and expressions
#for (name, rule) in rules.pairs().rev() {
[== #name]
render(rule, css: css)
}
#let substitute(base-rule) = { #let substitute(base-rule) = {
let new-rule = base-rule let new-rule = base-rule
for (key, rule) in by-name.pairs() { for name in inline {
new-rule = new-rule.replace("'" + key + "'", rule.text.slice(1, -1)) let rule = rules.at(name)
let replacement = rule.text.slice(1, -1).replace(regex("\[`.*?`"), "[")
replacement = "[" + replacement + "#`" + name + "`]"
new-rule = new-rule.replace(
"'" + name + "'",
replacement,
)
} }
if new-rule != base-rule { if new-rule != base-rule {
new-rule = substitute(new-rule) new-rule = substitute(new-rule)
@@ -66,9 +74,16 @@
return new-rule return new-rule
} }
#let combined = raw(substitute(annotation.text))
#set page(flipped: true) #set page(flipped: true)
#render(combined)
*/
= Combined rules
#for (name, rule) in rules.pairs() {
if not name in inline {
[== #name]
let combined = substitute(rule.text)
render(raw(combined), css: css)
//raw(block: true, combined)
}
}