-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdemo.tm
90 lines (61 loc) · 1.96 KB
/
demo.tm
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
87
88
89
90
language demo(go);
lang = "demo"
package = "github.com/mewspring/demo/dmo"
eventBased = true
eventFields = true
eventAST = true
# ### [ Lexical part ] #########################################################
:: lexer
_decimal_digit = /[0-9]/
_new_line : /[\n]/
# === [ Integer literals ] =====================================================
int_lit_tok : /[-]?[0-9]+/
_decimals = /{_decimal_digit}+/
# === [ Floating-point literals ] ==============================================
float_lit_tok : /{_frac_lit}/
_frac_lit = /{_sign}?{_decimals}[\.]{_decimal_digit}*/
_sign = /[+-]/
# === [ Tokens ] ===============================================================
',' : /[,]/
# ### [ Syntax part ] ##########################################################
:: parser
%input File;
# === [ Demo file ] ============================================================
File -> File
: FileHeader Commands=Command*
;
# --- [ Literals ] -------------------------------------------------------------
IntLit -> IntLit
: int_lit_tok
;
FloatLit -> FloatLit
: float_lit_tok
| int_lit_tok # to support short form float for 0 and 1.
;
# --- [ File header ] ----------------------------------------------------------
# FileHeader
# // File format version.
# VersionNum
# // Save number (e.g. "single_#.sv").
# SaveNum
# // Screen dimensions.
# ScreenWidth, ScreenHeight
FileHeader -> FileHeader
: VersionNum=IntLit ',' SaveNum=IntLit ',' ScreenWidth=IntLit ',' ScreenHeight=IntLit _new_line
;
# --- [ Commands ] -------------------------------------------------------------
# Command
# // Progress to next game tick in range [0.0, 1.0].
# GameTickProgress
Command -> Command
: CommandType=CommandTypeEnum ',' GameTickProgress=FloatLit EventData=(',' EventData)? _new_line
;
CommandTypeEnum -> CommandTypeEnum
: int_lit_tok
;
EventData -> EventData
: EventType=EventType ',' WParam=IntLit ',' LParam=IntLit
;
EventType -> EventType
: int_lit_tok # uint32
;