~sircmpwn/ipcgen

22011ff0871d6274b04dbcabbaefe87632379ba8 — Drew DeVault 2 months ago dbbd727
parse: implement enums with shift
2 files changed, 8 insertions(+), 5 deletions(-)

M lex/lex.ha
M parse/enum.ha
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)?;