File: parse_u32_blocks.re

package info (click to toggle)
re2c 4.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 51,512 kB
  • sloc: cpp: 34,160; ml: 8,494; sh: 5,311; makefile: 1,014; haskell: 611; python: 431; ansic: 234; javascript: 113
file content (82 lines) | stat: -rw-r--r-- 1,794 bytes parent folder | download | duplicates (2)
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
71
72
73
74
75
76
77
78
79
80
81
82
# re2py $INPUT -o $OUTPUT

class State:
    def __init__(self, str):
        self.yyinput = str
        self.yycursor = 0
        self.yymarker = 0

# Common re2c definitions shared between all functions.
%{
    re2c:api = record;
    re2c:yyrecord = st;
    re2c:yyfill:enable = 0;
    re2c:indent:top = 2;
%}

def parse_u32(str):
    st = State(str)
%{local
    re2c:indent:top = 1;

    '0b' / [01]        { return parse_bin(st) }
    "0"                { return parse_oct(st) }
    "" / [1-9]         { return parse_dec(st) }
    '0x' / [0-9a-fA-F] { return parse_hex(st) }
    *                  { return None }
%}

def parse_bin(st):
    n = 0
    while True: %{
        [01] {
            n = n * 2 + (st.yyinput[st.yycursor - 1] - 48)
            break
        }
        * { return n }
    %}

def parse_oct(st):
    n = 0
    while True: %{
        [0-7] {
            n = n * 8 + (st.yyinput[st.yycursor - 1] - 48)
            break
        }
        * { return n }
    %}

def parse_dec(st):
    n = 0
    while True: %{
        [0-9] {
            n = n * 10 + (st.yyinput[st.yycursor - 1] - 48)
            break
        }
        * { return n }
    %}

def parse_hex(st):
    n = 0
    while True: %{
        [0-9] {
            n = n * 16 + (st.yyinput[st.yycursor - 1] - 48)
            break
        }
        [a-f] {
            n = n * 16 + (st.yyinput[st.yycursor - 1] - 87)
            break
        }
        [A-F] {
            n = n * 16 + (st.yyinput[st.yycursor - 1] - 55)
            break
        }
        * { return n }
    %}

assert parse_u32(b"\0") == None
assert parse_u32(b"1234567890\0") == 1234567890
assert parse_u32(b"0b1101\0") == 13
assert parse_u32(b"0x7Fe\0") == 2046
assert parse_u32(b"0644\0") == 420
assert parse_u32(b"9999999999\0") == 9999999999