-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathparse_test.py
More file actions
executable file
·86 lines (72 loc) · 2.38 KB
/
parse_test.py
File metadata and controls
executable file
·86 lines (72 loc) · 2.38 KB
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
83
84
85
86
#!/bin/env python3
"""
"""
from typing import List
import sys
import struct
from Util import parse
def EmitString(s: str):
b = parse.EscapedStringToBytes(t[1:-1])
t2 = parse.BytesToEscapedString(b)
print('"' + t2 + '"', end="")
def EmitId(s: str):
print("{" + t + "}", end="")
def Flt64FromBits(data: int) -> float:
return struct.unpack('<d', int.to_bytes(data, 8, "little"))[0]
def Flt64ToBits(num: float) -> int:
b = struct.pack('<d', num)
assert len(b) == 8
return int.from_bytes(b, "little")
if __name__ == '__main__':
mode = sys.argv[1]
for line in sys.stdin:
print()
line = line[:-1]
print(line)
if mode == "lex":
try:
token: List[str] = parse.ParseLine(line)
# print (repr(token))
sep = ""
for t in token:
print(sep, end="")
sep = " "
if t.startswith('"'):
EmitString(t)
else:
EmitId(t)
except Exception as err:
print("@FAILED@")
print()
else:
assert mode == "num"
token = line.split()
assert len(token) == 2
if token[0] == "uint64":
val = parse.ParseUint64(token[1])
if val is None:
print(f"[UINT64] @BAD VALUE@")
else:
print(f"[UINT64] {val} {val:x}")
elif token[0] == "int64":
val = parse.ParseInt64(token[1])
if val is None:
print(f"[INT64] @BAD VALUE@")
else:
print(f"[INT64] {val} {val & ((1 << 64) - 1):x}")
elif token[0] == "flt64":
if token[1].startswith("0x"):
out = int(token[1], 0)
val = Flt64FromBits(out)
else:
val = float(token[1])
if val is None:
print(f"[FLT64] @BAD VALUE@")
else:
print(f"[FLT64] {val:g} {Flt64ToBits(val):x}")
elif token[0] == "char":
val = parse.ParseChar(token[1])
if val is None:
print(f"[CHAR] @BAD VALUE@")
else:
print(f"[CHAR] {val}")