aboutsummaryrefslogtreecommitdiff
path: root/compiler/elymasLexer.ey
blob: e4a2cec3cfa46e755d18fb215c931fe5b1524558 (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
64
65
66
67
68
69
70
<
  { assembler -01 . } ":" deff
  { assemblerLibrary -01 . } "::" deff
  assembler .|label "@" deff
  "%" _ : -01 deff

  <
    [ /0 /1 /2 /3 /4 /5 /6 /7 /8 /9 ] ==digits

    { 0 ==result
      { "(.)(.*)" regex } {
        { eq }_ digits -01 index result 10 mul add =result
      } loop
      result
    }
  > -- /base10decode deff

  { .value base10decode ==v
    v 4294967296 lt {
      [
        # load value
        v /rdx :movqImmReg
        63 /rdx :btsqImm8Reg
        /rdx :pushqReg
      ] :execute
    } {
      [
        # allocate int
        ::internalAllocateInteger /rax :movqImmReg
        /rax :callqReg

        # push int address on program stack
        /rax :pushqReg

        # type zero does not need to be changed

        # load value
        8 /rax :addqImm8Reg
        v /rdx :movqImmReg
        /rdx /rax :movqRegMem
      ] :execute
    } ? *
  } /TOKINT

  { .value ::constStringCode :execute } /TOKSTR

  { .value ::constStringCode
    [
      global .internalExecuteIdentifier /rax :movqImmReg
      /rax :callqReg
    ] cat :execute
  } /TOKID

  { "floats not supported during initial compilation stage" die } /TOKFLOAT
> -- 4 |defv rep

{ /input defv
  "" {
    4096 input .read cat
    _ "" eq not
  } {
    { _ "([^\\n]*)\\n(.*)" regex } { -102 -- TOKFLOAT TOKINT TOKSTR TOKID elymas .tokenize {
      _ .handle
      # assemblerLibrary .stackDump
      # assemblerLibrary .globalScopeDump
    } each } loop
  } loop --
} /executeFile deff

# vim: syn=elymas