11% { open Parser_ast % }
22% { open Preprocess % }
3+ % {
4+ let encode_cases lst default =
5+ List. fold_right (fun (cond , ast ) acc ->
6+ [ITE (cond, ast, acc)]
7+ ) lst default |> List. hd
8+ % }
39
410% token HEADER
511% token NULL
3642% token BAND
3743% token LSL LSR ASR ROR RRX
3844% token LEQ GEQ LT GT
39- % token EOL
40- % token EOF
45+ % token IF ELSEIF ELSE ENDIF
46+ % token EOL EOF
4147
4248% nonassoc ARG
4349% nonassoc COMMA
5965%%
6066
6167% inline binop:
62- | MOD { OMod } | DIV { ODiv } | TIMES { OMul } | MINUS { OSub } | PLUS { OAdd }
63- | BAND { OBAnd } | BOR { OBOr } | OR { OOr } | XOR { OXor } | AND { OAnd }
64- | EQ { OEq } | NEQ { ONeq }
65- | LT { OLt } | GT { OGt } | LEQ { OLeq } | GEQ { OGeq }
66- | LSHIFT { OLShift } | RSHIFT { ORShift }
68+ | MOD { OMod } | DIV { ODiv } | TIMES { OMul } | MINUS { OSub } | PLUS { OAdd }
69+ | BAND { OBAnd } | BOR { OBOr } | OR { OOr } | XOR { OXor } | AND { OAnd }
70+ | EQ { OEq } | NEQ { ONeq }
71+ | LT { OLt } | GT { OGt } | LEQ { OLeq } | GEQ { OGeq }
72+ | LSHIFT { OLShift } | RSHIFT { ORShift }
73+ ;
6774
6875meta_expr:
6976 | i = NUMBER { MConst i }
@@ -74,8 +81,8 @@ meta_expr:
7481 | MINUS e = meta_expr % prec UMINUS { MUnary (ONeg , e) }
7582 | NOT e = meta_expr { MUnary (ONot , e) }
7683 | EXCLAM_MARK e = meta_expr { MUnary (OBNot , e) }
77- | e0 = meta_expr INTERROG_MARK e1 = meta_expr COLON e2 = meta_expr
78- { MCond (e0, e1, e2) }
84+ | e0 = meta_expr INTERROG_MARK e1 = meta_expr COLON e2 = meta_expr { MCond (e0, e1, e2) }
85+ ;
7986
8087definition:
8188 | HEADER ; id = ID ; EQUAL ; str = STRING { Param (id, HString str) }
@@ -87,23 +94,36 @@ definition:
8794 ;
8895
8996headers:
90- | list ( EOL ) ; HEADER ; EOL | list ( EOL ) ; HEADER ; EOF { [] }
91- | list ( EOL ) ; d = definition ; EOL ; ds = headers { d ::ds }
97+ | EOL * ; HEADER ; EOL | EOL * ; HEADER ; EOF { [] }
98+ | EOL * ; d = definition ; EOL ; ds = headers { d ::ds }
9299 ;
93100
94101ast:
95- | list (EOL ) ; EOF { [] }
96- | list (EOL ) ; cmd = command ; EOL ; cmds = ast { cmd ::cmds }
97- | list (EOL ) ; cmd = command ; EOF { [cmd] }
102+ | cmds = commands ; EOF { cmds }
98103 ;
99104
100105command:
106+ | { DUMMY }
101107 | id = ID ; args = separated_list(COMMA , arg) { ASM ($ startpos, id, args, Optimizer. NoTweaking ) }
102108 | id = ID ; args = separated_list(COMMA , arg) ; INTERROG_MARK { ASM ($ startpos, id, args, Optimizer. TweakMinLength ) }
103109 | id = ID ; args = separated_list(COMMA , arg) ; INTERROG_MARK ; i = NUMBER
104110 { ASM ($ startpos, id, args, Optimizer. TweakFixedLength (Utils. uint32_to_int i)) }
105111 | nb = number { BIN ($ startpos, nb) }
112+ | e = if_statement ; es = elseif* ; d = default { encode_cases (e::es) d }
113+ ;
114+
115+ if_statement:
116+ | IF ; e= meta_expr ; EOL ; cmds = commands { (e, cmds) }
106117 ;
118+ elseif:
119+ | ELSEIF ; e= meta_expr ; EOL ; cmds = commands { (e, cmds) }
120+ ;
121+ default:
122+ | ELSE ; EOL ; cmds = commands ; ENDIF { cmds }
123+ | ENDIF { [] }
124+ ;
125+
126+ % inline commands: cmds= separated_nonempty_list(EOL , command) { cmds } ;
107127
108128% inline maybe_hash:
109129 | {}
0 commit comments