M lex/lex.ha => lex/lex.ha +1 -1
@@ 89,7 89,7 @@ export fn next(lex: *lexer) (token | error) = {
return lex.loc: syntaxerr;
};
yield ltok::ELLIPSIS;
- case ':' =>
+ case ':', '<' =>
unread(lex, rn);
yield lex2(lex)?;
case ';' =>
M parse/enum.ha => parse/enum.ha +7 -4
@@ 28,12 28,15 @@ fn enum_member(lex: *lex::lexer) (ast::enum_member | error) = {
const name = strings::dup(want(lex, ltok::WORD)?.1 as str);
let val: (void | uint) = void;
- if (try(lex, ltok::EQUAL) is lex::token) {
+ if (try(lex, ltok::EQUAL) is lex::token) :out {
val = want(lex, ltok::INTEGER)?.1 as uint;
- };
- if (try(lex, ltok::LSHIFT)? is lex::token) {
- abort(); // TODO
+ if (!(try(lex, ltok::LSHIFT)? is lex::token)) {
+ yield :out;
+ };
+
+ const shift = want(lex, ltok::INTEGER)?.1 as uint;
+ val = (val as uint) << shift;
};
want(lex, ltok::COMMA)?;