diff options
Diffstat (limited to 'lib9p/idl/__init__.py')
-rw-r--r-- | lib9p/idl/__init__.py | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/lib9p/idl/__init__.py b/lib9p/idl/__init__.py index 2d09217..3133cc4 100644 --- a/lib9p/idl/__init__.py +++ b/lib9p/idl/__init__.py @@ -647,17 +647,16 @@ def re_string(grpname: str) -> str: re_line_version = f"version\\s+{re_string('version')}" re_line_import = f"from\\s+(?P<file>\\S+)\\s+import\\s+(?P<syms>{re_impname}(?:\\s*,\\s*{re_impname})*)" re_line_num = f"num\\s+(?P<name>{re_symname})\\s*=\\s*(?P<prim>{re_priname})" +re_line_num_ = f"num\\s+(?P<name>{re_symname})\\s*\\+=\\s*{re_string('spec')}" re_line_bitfield = f"bitfield\\s+(?P<name>{re_symname})\\s*=\\s*(?P<prim>{re_priname})" -re_line_bitfield_ = ( - f"bitfield\\s+(?P<name>{re_symname})\\s*\\+=\\s*{re_string('member')}" -) +re_line_bitfield_ = f"bitfield\\s+(?P<name>{re_symname})\\s*\\+=\\s*{re_string('spec')}" re_line_struct = ( f"struct\\s+(?P<name>{re_symname})\\s*(?P<op>\\+?=)\\s*{re_string('members')}" ) re_line_msg = ( f"msg\\s+(?P<name>{re_msgname})\\s*(?P<op>\\+?=)\\s*{re_string('members')}" ) -re_line_cont = f"\\s+{re_string('specs')}" # could be bitfield/struct/msg +re_line_cont = f"\\s+{re_string('spec')}" # could be bitfield/struct/msg def parse_file( @@ -741,6 +740,11 @@ def parse_file( raise ValueError(f"duplicate type name {num.typname!r}") env[num.typname] = num prev = num + elif m := re.fullmatch(re_line_num_, line): + num = get_type(env, m.group("name"), Number) + parse_numspec(env, version, num, m.group("spec")) + + prev = num elif m := re.fullmatch(re_line_bitfield, line): prim = env[m.group("prim")] assert isinstance(prim, Primitive) @@ -754,7 +758,7 @@ def parse_file( prev = bf elif m := re.fullmatch(re_line_bitfield_, line): bf = get_type(env, m.group("name"), Bitfield) - parse_bitspec(env, version, bf, m.group("member")) + parse_bitspec(env, version, bf, m.group("spec")) prev = bf elif m := re.fullmatch(re_line_struct, line): @@ -798,11 +802,11 @@ def parse_file( elif m := re.fullmatch(re_line_cont, line): match prev: case Bitfield(): - parse_bitspec(env, version, prev, m.group("specs")) + parse_bitspec(env, version, prev, m.group("spec")) case Number(): - parse_numspec(env, version, prev, m.group("specs")) + parse_numspec(env, version, prev, m.group("spec")) case Struct(): # and Message() - parse_members(version, env, prev, m.group("specs")) + parse_members(version, env, prev, m.group("spec")) case _: raise SyntaxError( "continuation line must come after a bitfield, struct, or msg line" |