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-- 2,862 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
// re2java $INPUT -o $OUTPUT

class Parser {
    private String yyinput;
    private int yycursor;
    private int yymarker;
    private int number;

    private void add_digit(int base, int offset) throws ArithmeticException {
        number = Math.addExact(
            Math.multiplyExact(number, base),
            yyinput.charAt(yycursor - 1) - offset);
    }

    public int parse(String str) throws ArithmeticException, IllegalArgumentException {
        yyinput = str;
        yycursor = 0;
        number = 0;

        try {
            /*!re2c
                re2c:YYCTYPE = "char";
                re2c:YYPEEK = "yyinput.charAt(yycursor)";
                re2c:yyfill:enable = 0;

                end = "\x00";

                '0b' / [01]        { return parse_bin(); }
                "0"                { return parse_oct(); }
                ""   / [1-9]       { return parse_dec(); }
                '0x' / [0-9a-fA-F] { return parse_hex(); }
                *                  { throw new IllegalArgumentException("not a number"); }
            */
        } catch (Exception e) {
            return -1;
        }
    }

    private int parse_bin() throws ArithmeticException, IllegalArgumentException {
        /*!re2c
            end   { return number; }
            [01]  { add_digit(2, 48); return parse_bin(); }
            *     { throw new IllegalArgumentException("ill-formed binary number"); }
        */
    }

    private int parse_oct() throws ArithmeticException, IllegalArgumentException {
        /*!re2c
            end   { return number; }
            [0-7] { add_digit(8, 48); return parse_oct(); }
            *     { throw new IllegalArgumentException("ill-formed octal number"); }
        */
    }

    private int parse_dec() throws ArithmeticException, IllegalArgumentException {
        /*!re2c
            end   { return number; }
            [0-9] { add_digit(10, 48); return parse_dec(); }
            *     { throw new IllegalArgumentException("ill-formed decimal number"); }
        */
    }

    private int parse_hex() throws ArithmeticException, IllegalArgumentException {
        /*!re2c
            end   { return number; }
            [0-9] { add_digit(16, 48); return parse_hex(); }
            [a-f] { add_digit(16, 87); return parse_hex(); }
            [A-F] { add_digit(16, 55); return parse_hex(); }
            *     { throw new IllegalArgumentException("ill-formed hexadecimal number"); }
        */
    }

    public static void main(String []args) {
        Parser parser = new Parser();
        assert parser.parse("1234567890\0") == 1234567890;
        assert parser.parse("0b1101\0") == 0b1101;
        assert parser.parse("0x007Fe\0") == 0x7fe;
        assert parser.parse("0644\0") == 0644;
        assert parser.parse("9999999999\0") == -1;
        assert parser.parse("123??\0") == -1;
    }
};