blob: c4982ac5ae1ccaad9b6cf463bc6e9512941fa72a (
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
|
token WS / space /
context number
context unsigned
literal `true `false
token OCT / '0'[0-7]+ /
token DEC / [0-9]+ /
token HEX / '0x' xdigit+ /
int strtoull(a:str, b:int) = c_strtoull
def type
value:int
[`false] { lhs.value = 0 }
| [`true] { lhs.value = 1 }
| [OCT] { lhs.value = strtoull($r1, 8) }
| [DEC] { lhs.value = strtoull($r1, 10) }
| [HEX] { lhs.value = strtoull($r1, 16) }
end
lex
ignore / space+ /
literal `+ `-
end
def type
value:int
[unsigned::type] { lhs.value = r1.value }
| [`- type] { lhs.value = r2.value - (r2.value * 2) }
| [`+ type] { lhs.value = r2.value }
end
context string
rl ESC / '\\' /
token ESC_CHR / ESC [abfnrtv\\'"e] /
token ESC_HEX / ESC 'x' xdigit{2} /
token ESC_OCT / ESC [0-7]{1,3} /
token CHAR / ^cntrl - ['"] - ESC /
literal `' `"
def raw
[ESC_CHR]
| [ESC_HEX]
| [ESC_OCT]
| [CHAR]
def type
length:int
[`' raw:raw* `'] { i:int = 0 for s:raw in r2 i = i + 1 lhs.length = i }
| [`" raw:raw* `"] { i:int = 0 for s:raw in r2 i = i + 1 lhs.length = i }
end
|