diff --git a/ulm-spec/.gitignore b/ulm-spec/.gitignore index 7d5b7a9..c925c21 100644 --- a/ulm-spec/.gitignore +++ b/ulm-spec/.gitignore @@ -1,2 +1,2 @@ -/build +/dist /node_modules diff --git a/ulm-spec/ARITHMETIC.md b/ulm-spec/ARITHMETIC.md deleted file mode 100644 index 6c84d31..0000000 --- a/ulm-spec/ARITHMETIC.md +++ /dev/null @@ -1,15 +0,0 @@ -# Arithmetic - -## [NumericExpression](./NumericExpression/README.md) - -## [NumericOperation](./NumericOperation/README.md) - -## [NumericAdditionOperation](./NumericAdditionOperation/README.md) - -## [NumericMultiplicationOperation](./NumericMultiplicationOperation/README.md) - -## [NumericRelation](./NumericRelation/README.md) - -## [NumericEqualRelation](./NumericEqualRelation/README.md) - -## [NumericNotEqualRelation](./NumericNotEqualRelation/README.md) diff --git a/ulm-spec/EXPRESSIONS.md b/ulm-spec/EXPRESSIONS.md new file mode 100644 index 0000000..35a9ab5 --- /dev/null +++ b/ulm-spec/EXPRESSIONS.md @@ -0,0 +1,70 @@ +# Expressions + +## Group + +A group has no semantic meaning, but can be used to apply presentation rules to +expressions or values. + +```ulm example +Group(25, +(1, 16)) +``` + +```ulm example +g(25, +(1, 16), { color: "red" }) +``` + +## AmbiguousSymbol + +```ulm example +AmbiguousSymbol("x") +``` + +```ulm example +$("x") +``` + +```ulm example +=($("x"), 25) // x = 25 +``` + +## AmbiguousPlaceholder + +```ulm example +AmbiguousPlaceholder() +``` + +```ulm example +?({ color: "red" }) +``` + +## AmbiguousAdditionOperation + +```ulm example +AmbiguousAdditionOperation(11, 31) +``` + +```ulm example ++(5, 5, { color: "red" }) +``` + +## AmbiguousSubtractionOperation + +## AmbiguousMultiplicationOperation + +## AmbiguousDivisionOperation + +## AmbiguousEqualRelation + +## AmbiguousNotEqualRelation + +## NumericAdditionOperation + +## NumericSubtractionOperation + +## NumericMultiplicationOperation + +## NumericDivisionOperation + +## NumericEqualRelation + +## NumericNotEqualRelation diff --git a/ulm-spec/Expression/README.md b/ulm-spec/Expression/README.md deleted file mode 100644 index d846654..0000000 --- a/ulm-spec/Expression/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Expression - -The most generic type that represents any other type. - -## Definition - -TypeScript: - -```ts -type Expression = NumericExpression | NumericRelation; -``` diff --git a/ulm-spec/IntegerNumber/README.md b/ulm-spec/IntegerNumber/README.md deleted file mode 100644 index 9612f38..0000000 --- a/ulm-spec/IntegerNumber/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# IntegerNumber - -IntegerNumber :: - - Sign? 0 i - - Sign? LeadingDigit Digit* i - -## Definition - -TypeScript: - -```ts -type IntegerNumber = bigint; -``` - -## Examples - -### ULMScript - -``` -1i -``` diff --git a/ulm-spec/LANGUAGE.md b/ulm-spec/LANGUAGE.md deleted file mode 100644 index ce85fbc..0000000 --- a/ulm-spec/LANGUAGE.md +++ /dev/null @@ -1,9 +0,0 @@ -# Language - -LeadingDigit :: one of 1 2 3 4 5 6 7 8 9 - -TrueDigit :: one of 0 1 2 3 4 5 6 7 8 9 - -Digit :: one of 0 1 2 3 4 5 6 7 8 9 _ - -Sign :: one of - + diff --git a/ulm-spec/NaturalNumber/README.md b/ulm-spec/NaturalNumber/README.md deleted file mode 100644 index c8fb51e..0000000 --- a/ulm-spec/NaturalNumber/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# NaturalNumber - -NaturalNumber :: LeadingDigit Digit* n - -A positive integer (not including zero). `{ 1, 2, 3, … }` - -## Definition - -TypeScript: - -```ts -type NaturalNumber = bigint; -``` - -## Examples - -### ULMScript - -``` -34n -``` diff --git a/ulm-spec/NumericAdditionOperation/README.md b/ulm-spec/NumericAdditionOperation/README.md deleted file mode 100644 index 88b425f..0000000 --- a/ulm-spec/NumericAdditionOperation/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# NumericAdditionOperation - -A binary operation that adds two numeric values together. - -## Definition - -TypeScript: - -```ts -interface NumericAdditionOperation { - type: "NumericAdditionOperation"; - operands: [NumericExpression, NumericExpression]; - presentation?: { - layout?: "vertical" | "inline"; // default = "inline" - }; -} -``` - -## Examples - -### AST - -```yaml -# 1 + 2 -type: NumericAdditionOperation -operands: - - type: RationalNumber - numerator: 1 - - type: RationalNumber - numerator: 2 -``` - -```yaml -# 0.1 -# + 5.0 -type: NumericAdditionOperation -presentation: - layout: vertical -operands: - - type: RationalNumber - numerator: 1 - denominator: 10 - - type: RationalNumber - numerator: 5 -``` - -### ULMScript - -``` -+(1, 3) -``` - -``` -NumericAdditionOperation(10, 456) -``` diff --git a/ulm-spec/NumericEqualRelation/README.md b/ulm-spec/NumericEqualRelation/README.md deleted file mode 100644 index 02b8899..0000000 --- a/ulm-spec/NumericEqualRelation/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# NumericEqualRelation - -Equal. - -## Definition - -TypeScript: - -```ts -interface NumericEqualRelation = { - type: "NumericEqualRelation"; - operands: [NumericExpression, NumericExpression]; -}; -``` - -## Examples - -```yaml -# 4 = 4 -type: NumericEqualRelation -operands: - - type: RationalNumber - numerator: 4 - - type: RationalNumber - numerator: 4 -``` - -```yaml -# 0.1 + 0.2 = 0.3 -type: NumericEqualRelation -operands: - - type: NumericAdditionOperation - operands: - - type: RationalNumber - numerator: 1 - denominator: 10 - - type: RationalNumber - numerator: 2 - denominator: 10 - - type: RationalNumber - numerator: 3 - denominator: 10 -``` diff --git a/ulm-spec/NumericExpression/README.md b/ulm-spec/NumericExpression/README.md deleted file mode 100644 index dd89ad6..0000000 --- a/ulm-spec/NumericExpression/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# NumericExpression - -An expression that, if evaluated, returns a numeric value. - -## Definition - -TypeScript: - -```ts -type NumericExpression = RationalNumber | NumericOperation; -``` diff --git a/ulm-spec/NumericMultiplicationOperation/README.md b/ulm-spec/NumericMultiplicationOperation/README.md deleted file mode 100644 index 85f4312..0000000 --- a/ulm-spec/NumericMultiplicationOperation/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# NumericMultiplicationOperation - -A binary operation that multiplies two numeric values together. - -## Definition - -TypeScript: - -```ts -interface NumericMultiplicationOperation { - type: "NumericMultiplicationOperation"; - operands: [NumericExpression, NumericExpression]; - presentation?: { - style?: "dot" | "times"; // default = "times" - layout?: "vertical" | "inline"; // default = "inline" - }; -} -``` - -## Examples - -```yaml -# 4 × 7 -type: NumericMultiplicationOperation -presentation: - style: dot -operands: - - type: RationalNumber - numerator: 4 - - type: RationalNumber - numerator: 7 -``` - -```yaml -# 4 × 7 -type: NumericMultiplicationOperation -operands: - - type: RationalNumber - numerator: 9999 - denominator: 100 - - type: RationalNumber - numerator: 7 -``` - -```yaml -# 0.1 • 5 -type: NumericMultiplicationOperation -presentation: - style: dot -operands: - - type: RationalNumber - numerator: 1 - denominator: 10 - - type: RationalNumber - numerator: 5 -``` diff --git a/ulm-spec/NumericNotEqualRelation/README.md b/ulm-spec/NumericNotEqualRelation/README.md deleted file mode 100644 index 57ec916..0000000 --- a/ulm-spec/NumericNotEqualRelation/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# NumericNotEqualRelation - -Not equal. - -## Definition - -TypeScript: - -```ts -interface NumericNotEqualRelation { - type: "NumericNotEqualRelation"; - operands: [NumericExpression, NumericExpression]; -} -``` - -## Examples - -```yaml -# 4 ≠ 25 -type: NumericNotEqualRelation -operands: - - type: RationalNumber - numerator: 4 - - type: RationalNumber - numerator: 25 -``` - -```yaml -# 0.1 + 0.2 <> 0.30000000000000004 -type: NumericNotEqualRelation -presentation: - style: angleBrackets -operands: - - type: NumericAdditionOperation - operands: - - type: RationalNumber - numerator: 1 - denominator: 10 - - type: RationalNumber - numerator: 2 - denominator: 10 - - type: RationalNumber - numerator: 30_000_000_000_000_004 - denominator: 100_000_000_000_000_000 -``` diff --git a/ulm-spec/NumericOperation/README.md b/ulm-spec/NumericOperation/README.md deleted file mode 100644 index e98bb0f..0000000 --- a/ulm-spec/NumericOperation/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# NumericOperation - -An operation that, if evaluated, returns in a numeric value. - -## Definition - -TypeScript: - -```ts -type NumericOperation = NumericAdditionOperation | NumericMultiplicationOperation; -``` diff --git a/ulm-spec/NumericRelation/README.md b/ulm-spec/NumericRelation/README.md deleted file mode 100644 index 8048266..0000000 --- a/ulm-spec/NumericRelation/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# NumericRelation - -Describes a relationship between numeric values. - -## Definition - -TypeScript: - -```ts -type NumericRelation = NumericEqualRelation | NumericNotEqualRelation; -``` diff --git a/ulm-spec/PRESENTATION.md b/ulm-spec/PRESENTATION.md new file mode 100644 index 0000000..4c94d9e --- /dev/null +++ b/ulm-spec/PRESENTATION.md @@ -0,0 +1,7 @@ +# Presentation + +- `color` (`"red"` or `"#ff00ff"`) +- `division-format` (`"fraction"` or `"obelus"` or `"ratio"`) +- `number-format` (`"decimal"` or `"fraction"`) +- `number-decimal-places` (`3`) +- `number-decimal-rounding` (`"nearest"` or `"down"` or `"up"`) diff --git a/ulm-spec/PRIMITIVES.md b/ulm-spec/PRIMITIVES.md deleted file mode 100644 index f10a405..0000000 --- a/ulm-spec/PRIMITIVES.md +++ /dev/null @@ -1,11 +0,0 @@ -# Primitives - -## [NaturalNumber](./NaturalNumber/README.md) - -## [WholeNumber](./WholeNumber/README.md) - -## [IntegerNumber](./IntegerNumber/README.md) - -## [RationalNumber](./RationalNumber/README.md) - -## [Expression](./Expression/README.md) diff --git a/ulm-spec/README.md b/ulm-spec/README.md index 07de60a..efce08c 100644 --- a/ulm-spec/README.md +++ b/ulm-spec/README.md @@ -1,14 +1,47 @@ Universal Language for Mathematics (ULM) ---------------------------------------- -⚠️ WIP ⚠️ +⚠️ DRAFT # Overview -ULM is a language for describing both the semantics and presentation of mathematical expressions. +ULM is a language for describing both the semantics and presentation of +mathematical expressions. -# [Language](./LANGUAGE.md) +Here is a simple expression written in ULMScript: -# [Primitives](./PRIMITIVES.md) +```ulm example ++(2, 2) +``` -# [Arithmetic](./ARITHMETIC.md) +That's just `2 + 2`. + +Here is a more complicated expression: + +```ulm example +=( + -( + 245.5, + ÷(11, 2, { division-style: "fraction" }) + ), + *( + +(100, 20), + 2, + { color: "blue" } + ) +) +``` + +Which could be displayed like this: + +![example](./example.png) + +# [Source](./SOURCE.md) + +# [Tokens](./TOKENS.md) + +# [Syntax](./SYNTAX.md) + +# [Expressions](./EXPRESSIONS.md) + +# [Presentation](./PRESENTATION.md) diff --git a/ulm-spec/RationalNumber/README.md b/ulm-spec/RationalNumber/README.md deleted file mode 100644 index 970e36a..0000000 --- a/ulm-spec/RationalNumber/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# RationalNumber - -RationalNumber :: - - Sign? 0 - - Sign? LeadingDigit Digit* - - Sign? 0 . TrueDigit Digit* - - Sign? LeadingDigit Digit* . TrueDigit Digit* - - Sign? 0 `/` LeadingDigit Digit* - - Sign? LeadingDigit Digit* `/` LeadingDigit Digit* diff --git a/ulm-spec/SOURCE.md b/ulm-spec/SOURCE.md new file mode 100644 index 0000000..424e0ae --- /dev/null +++ b/ulm-spec/SOURCE.md @@ -0,0 +1,47 @@ +# Source + +SourceChar ::: /[\u0009\u000A\u000D\u0020-\uFFFF]/ + +UnicodeBOM ::: "Byte Order Mark (U+FEFF)" + +WhiteSpace ::: + - "Horizontal Tab (U+0009)" + - "Space (U+0020)" + +LineTerminator ::: + - "New Line (U+000A)" + - "Carriage Return (U+000D)" [ lookahead ! "New Line (U+000A)" ] + - "Carriage Return (U+000D)" "New Line (U+000A)" + +SeparatorChar ::: + - UnicodeBOM + - WhiteSpace + - LineTerminator + - , + - ; + +Sign ::: one of - + + +Digit ::: one of 0 1 2 3 4 5 6 7 8 9 _ + +TrueDigit ::: Digit but not _ + +LeadingDigit ::: TrueDigit but not 0 + +IdentifierChar ::: SourceChar but not one of LineTerminator, SeparatorChar, :, {, }, (, ), [, ] + +Note: Square brackets (`[` and `]`) are not currently used in the language, but have +been reserved to represent lists in the future. + +LeadingIdentifierChar ::: IdentifierChar but not TrueDigit or Sign + +EscapedUnicode ::: /[0-9A-Fa-f]{4}/ + +EscapedChar ::: one of `"` \ `/` b f n r t + +StringChar ::: + - SourceChar but not `"` or \ or LineTerminator + - \u EscapedUnicode + - \ EscapedChar + +CommentChar ::: SourceChar but not LineTerminator diff --git a/ulm-spec/SYNTAX.md b/ulm-spec/SYNTAX.md new file mode 100644 index 0000000..2bc6036 --- /dev/null +++ b/ulm-spec/SYNTAX.md @@ -0,0 +1,142 @@ +# Syntax + +## Ignored + +Ignored : + - Comment + - Separator + +Comment: + +```ulm example +// Hello, this is a comment. +``` + +Separator: + +```ulm example +, + ; +``` + +## Value + +Value : + - NaturalNumberLiteral + - IntegerNumberLiteral + - RationalNumberLiteral + - StringLiteral + +```ulm example +5n +``` + +```ulm example +-48i +``` + +```ulm example +-48/7 +``` + +```ulm example +0.53 +``` + +```ulm example +"Hello" +``` + +## NamedValue + +NamedValue : Identifier Ignored* Colon Ignored* Value + +NamedValue_list : + - NamedValue_list Ignored* NamedValue + - NamedValue + +```ulm example +foo:5n +``` + +```ulm example +foo : 5n +``` + +## Operand + +Operand : + - Value + - Operator + +Operand_list : + - Operand_list Ignored* Operand + - Operand + +```ulm example +5n +``` + +```ulm example +foo() +``` + +## Presentation + +Presentation : LeftCurly Ignored* NamedValue_list? Ignored* RightCurly + +```ulm example +{ color: "red" } +``` + +```ulm example +{ color: "red"; number-format: "fraction"; } +``` + +## Expression + +ExpressionArgs : Operand_list? Ignored* NamedValue_list? Ignored* Presentation? + +Expression : Identifier Ignored* LeftParen Ignored* ExpressionArgs Ignored* RightParen + +```ulm example +foo() +``` + +```ulm example +foo(bar()) +``` + +```ulm example +foo(bar() abc:"xyz") +``` + +```ulm example +foo(bar() abc:"xyz" {color:"red"}) +``` + +```ulm example +foo ( bar() abc:"xyz" {color:"red"} ) +``` + +```ulm example +foo(bar(), abc: "xyz", { color: "red" }) +``` + +## Document + +DocPart : + - Expression + - Ignored + +Document : + - Document DocPart + - DocPart + +```ulm example +// Foo +foo() + +// Bar +bar() +``` diff --git a/ulm-spec/TOKENS.md b/ulm-spec/TOKENS.md new file mode 100644 index 0000000..9865b92 --- /dev/null +++ b/ulm-spec/TOKENS.md @@ -0,0 +1,331 @@ +# Tokens + +## Separator + +Separator :: SeparatorChar+ + +## Comment + +Comment :: // CommentChar* + +```example +// This is a comment! 😃 +``` + +## LeftParen + +LeftParen :: ( + +## RightParen + +RightParen :: ) + +## LeftCurly + +LeftCurly :: { + +## RightCurly + +RightCurly :: } + +## Colon + +Colon :: : + +## NaturalNumberLiteral + +NaturalNumberLiteral :: LeadingDigit Digit* `n` + +A positive integer (`{ 1, 2, 3, … }`). + +An natural number literal must always have an `n` suffix: + +```example +1n +``` + +```example +34n +``` + +Underscores may be used to make large numbers easier to read: + +```example +6_935n +``` + +Zero is not a natural number: + +```counter-example +0n +``` + +Natural number literals cannot have leading underscores: + +```counter-example +_42n +``` + +## IntegerNumberLiteral + +IntegerNumberLiteral :: + - Sign? 0 `i` + - Sign? LeadingDigit Digit* `i` + +An integer number literal must always have an `i` suffix: + +```example +0i +``` + +```example +52i +``` + +```example +500i +``` + +```counter-example +-2 +``` + +Underscores may be used to make large numbers easier to read: + +```example +5_000i +``` + +Integer number literal can be prefixed with either a positive or negative sign: + +```example +-0i +``` + +```example +-52i +``` + +```example +-500i +``` + +```example +-5_000i +``` + +```example ++0i +``` + +```example ++52i +``` + +```example ++500i +``` + +```example ++5_000i +``` + +Integer number literals cannot have leading zeros or underscores: + +```counter-example +042i +``` + +```counter-example +-042i +``` + +```counter-example +_42i +``` + +## RationalNumberLiteral + +RationalNumberLiteral :: + - Sign? `0` + - Sign? LeadingDigit Digit* + - Sign? `0` `.` TrueDigit Digit* + - Sign? LeadingDigit Digit* `.` TrueDigit Digit* + - Sign? `0` `/` LeadingDigit Digit* + - Sign? LeadingDigit Digit* `/` LeadingDigit Digit* + +```ulm example +0 +``` + +```ulm example +12 +``` + +```ulm example +0.4 +``` + +```ulm example +0.50 +``` + +```ulm example +40.145 +``` + +```ulm example +5_542.1_11 +``` + +```ulm example +0/1 +``` + +```ulm example +0/1_000 +``` + +```ulm example +1/1 +``` + +```ulm example +1_243/1000 +``` + +```ulm example +-0 +``` + +```ulm example +-12 +``` + +```ulm example +-0.4 +``` + +```ulm example +-0.50 +``` + +```ulm example +-40.145 +``` + +```ulm example +-5_542.1_11 +``` + +```ulm example +-0/1 +``` + +```ulm example +-0/1_000 +``` + +```ulm example +-1/1 +``` + +```ulm example +-1_243/1000 +``` + +```ulm example ++0 +``` + +```ulm example ++12 +``` + +```ulm example ++0.4 +``` + +```ulm example ++0.50 +``` + +```ulm example ++40.145 +``` + +```ulm example ++5_542.1_11 +``` + +```ulm example ++0/1 +``` + +```ulm example ++0/1_000 +``` + +```ulm example ++1/1 +``` + +```ulm example ++1_243/1000 +``` + +## StringLiteral + +StringLiteral :: `"` StringChar* `"` + +```ulm example +"This is a string" +``` + +## Identifier + +Identifier :: + - Sign + - Sign Sign IdentifierChar* + - Sign? LeadingIdentifierChar IdentifierChar* but not `TRUE` or `FALSE` + +Note: The `TRUE` and `FALSE` identifiers are not currently used in the language, +but have been reserved to represent boolean literals in the future. + +```ulm example ++ +``` + +```ulm example +^ +``` + +```ulm example +** +``` + +```ulm example +atan2 +``` + +```ulm example +PascalCase +``` + +```ulm example +snake_case +``` + +```ulm example +-kebab-case- +``` + +```ulm example +__this_is_valid!__ +``` + +This is not a comment because there is no separator between `foo` and `//`: + +```ulm example +foo//bar +``` diff --git a/ulm-spec/WholeNumber/README.md b/ulm-spec/WholeNumber/README.md deleted file mode 100644 index 876a202..0000000 --- a/ulm-spec/WholeNumber/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# WholeNumber - -WholeNumber :: - - 0 w - - LeadingDigit Digit* w - -A positive integer or zero. `{ 0, 1, 2, … }` - -## Definition - -TypeScript: - -```ts -type WholeNumber = bigint; -``` - -## Examples - -### ULMScript - -``` -1w -``` diff --git a/ulm-spec/example.png b/ulm-spec/example.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3e20b4cc5d9cfafe31d3160060960dbc2317c7 GIT binary patch literal 17189 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 UE0W*78MM2})78&qol`;+01li=Q~&?~ literal 0 HcmV?d00001 diff --git a/ulm-spec/package.json b/ulm-spec/package.json index 6aab0ed..8d9b6da 100644 --- a/ulm-spec/package.json +++ b/ulm-spec/package.json @@ -3,8 +3,9 @@ "version": "0.0.0", "license": "MIT", "scripts": { - "build": "(rm -r ./build &>/dev/null || true) && mkdir ./build && spec-md ./README.md > ./build/index.html", - "now-build": "mkdir ./dist && spec-md ./README.md > ./dist/index.html", + "build": "spec-md ./README.md > ./dist/index.html && cp ./*.png ./dist/", + "dev-build": "(rm -r ./dist &>/dev/null || true) && mkdir ./dist && yarn run build", + "now-build": "yarn run build", "test": "exit 0" }, "devDependencies": {