diff --git a/parser/objt.go b/parser/objt.go index f384cff..ec64e08 100644 --- a/parser/objt.go +++ b/parser/objt.go @@ -96,6 +96,17 @@ func (parser *ParsingOperation) parseObjtMember () ( if err != nil { return } member.what, err = parser.parseType() if err != nil { return } + + println(parser.token.Describe()) + + // if there is a bit width, get it + if parser.token.Is(lexer.TokenKindBinaryAnd) { + err = parser.nextToken(lexer.TokenKindUInt) + if err != nil { return } + member.bitWidth = parser.token.Value().(uint64) + err = parser.nextToken() + if err != nil { return } + } // parse default value if parser.token.Is(lexer.TokenKindNewline) { diff --git a/parser/objt_test.go b/parser/objt_test.go index 68a4337..16a5439 100644 --- a/parser/objt_test.go +++ b/parser/objt_test.go @@ -9,6 +9,9 @@ func TestObjt (test *testing.T) { objt ro Basic:Obj ro that:Basic ro this:Basic +objt ro BitFields:Obj + ro that:Int & 1 + ro this:Int & 24 298 objt ro ComplexInit:Obj ro basic:Int 87 ro complex0:Bird diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index adbfcbd..114f681 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -297,6 +297,10 @@ func (member ObjtMember) ToString (indent int) (output string) { output += member.permission.ToString() + " " output += member.name + ":" output += member.what.ToString() + + if member.bitWidth > 0 { + output += fmt.Sprint(" & ", member.bitWidth) + } isComplexInitialization := member.defaultValue.kind == ArgumentKindObjectInitializationValues || diff --git a/parser/tree.go b/parser/tree.go index a0394ed..e1f2292 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -178,8 +178,9 @@ type TypeSection struct { type ObjtMember struct { location file.Location name string - + what Type + bitWidth uint64 permission types.Permission defaultValue Argument } @@ -188,7 +189,8 @@ type ObjtMember struct { type ObjtSection struct { location file.Location name string - + + // TODO: make this Identifier instead of Type inherits Type permission types.Permission // TODO: order matters here we need to store these in an array @@ -225,6 +227,7 @@ type FaceBehavior struct { type FaceSection struct { location file.Location name string + // TODO: make this Identifier instead of string inherits string permission types.Permission diff --git a/tests/parser/objt/main.arf b/tests/parser/objt/main.arf index a151314..7bdaf3c 100644 --- a/tests/parser/objt/main.arf +++ b/tests/parser/objt/main.arf @@ -4,6 +4,10 @@ objt ro Basic:Obj ro that:Basic ro this:Basic +objt ro BitFields:Obj + ro that:Int & 1 + ro this:Int & 24 298 + objt ro Init:Obj ro that:String "hello world" ro this:Int 23