aboutsummaryrefslogtreecommitdiff
path: root/core/text.nom
blob: 8b500f7c0647da38290e2f637fd54245ddc09154 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env nomsu -V5.12.12.8
#
    This file contains some definitions of text escape sequences, including ANSI console
    color codes.
    
use "core/metaprogramming.nom"
use "core/operators.nom"
use "core/control_flow.nom"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

test:
    assume "\[1, 2, 3]" == "[1, 2, 3]"
    assume "foo = \(1 + 2)!" == "foo = 3!"
    assume "one\ntwo" == "one\ntwo"
    assume "nogap" == "nogap"
    assume (["x", "y"]|joined with ",") == "x,y"
    assume (["x", "y"]|joined) == "xy"
    assume ("BAR"|byte 2) == 65
    assume ("BAR"|bytes 1 to 2) == [66, 65]
    assume ("asdf"|capitalized) == "Asdf"
    assume ("asdf"|uppercase) == "ASDF"
    assume ("asdf"|with "s" -> "X") == "aXdf"
    assume ("one\ntwo\n"|lines) == ["one", "two", ""]
    ($spec とは $body) parses as ($spec means $body)

test:
    $こんにちは = "こんにちは"
    ($ と言う) とは "\($)世界"
    assume ($こんにちは と言う) == "こんにちは世界"

($expr for $match in $text matching $patt) compiles to:
    define mangler
    return (..)
        Lua "
            (function()
                local \(mangle "comprehension") = List{}
                for \($match as lua expr) in (\($text as lua expr)):gmatch(\($patt as lua expr)) do
                    \(mangle "comprehension")[#\(mangle "comprehension")+1] = \($expr as lua)
                end
                return \(mangle "comprehension")
            end)()"

test:
    assume "\n" == (newline)

test:
    assume (0xDEADBEEF as hex) == "0xDEADBEEF"

externally ($num as hex) means:
    if ($num < 0):
        return ("-0x%X"|formatted with (- $num))
    ..else:
        return ("0x%X"|formatted with $num)

# Text literals
$escapes = {..}
    nl: "\n", newline: "\n", tab: "\t", bell: "\a", cr: "\r", "carriage return": "\r"
    backspace: "\b", "form feed": "\f", formfeed: "\f", "vertical tab": "\v"

for $name = $str in $escapes:
    with {$lua: Lua (quote $str)}:
        $compile.action.$name = (-> $lua)