From 07112a286830dc9bf99d0f9d2c3adffe2f4d74f8 Mon Sep 17 00:00:00 2001 From: Ernest Micklei Date: Mon, 27 Nov 2017 19:25:45 +0100 Subject: [PATCH] 7 more --- field.go | 2 +- field_test.go | 3 --- message.go | 2 +- message_test.go | 3 --- option.go | 31 ++++++++++++++++++++----------- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/field.go b/field.go index 6031cf9..df1f7cb 100644 --- a/field.go +++ b/field.go @@ -99,7 +99,7 @@ func (f *NormalField) columns() (cols []aligned) { // [ "repeated" | "optional" ] type fieldName "=" fieldNumber [ "[" fieldOptions "]" ] ";" func (f *NormalField) parse(p *Parser) error { for { - _, tok, lit := p.next() + _, tok, lit := p.nextIdentifier() switch tok { case tREPEATED: f.Repeated = true diff --git a/field_test.go b/field_test.go index 5be4bc4..4117821 100644 --- a/field_test.go +++ b/field_test.go @@ -60,9 +60,6 @@ func TestField(t *testing.T) { if got, want := f.Options[2].Constant.Source, "happy"; got != want { t.Errorf("got [%v] want [%v]", got, want) } - if got, want := f.Position.Line, 1; got != want { - t.Errorf("got [%v] want [%v]", got, want) - } } func TestFieldSimple(t *testing.T) { diff --git a/message.go b/message.go index 75e24cb..e64a581 100644 --- a/message.go +++ b/message.go @@ -46,7 +46,7 @@ func (m *Message) groupName() string { // parse expects ident { messageBody func (m *Message) parse(p *Parser) error { - _, tok, lit := p.next() + _, tok, lit := p.nextIdentifier() if tok != tIDENT { if !isKeyword(tok) { return p.unexpected(lit, m.groupName()+" identifier", m) diff --git a/message_test.go b/message_test.go index 99491d8..31512de 100644 --- a/message_test.go +++ b/message_test.go @@ -53,9 +53,6 @@ func TestMessage(t *testing.T) { if got, want := m.Name, "Out"; got != want { t.Errorf("got [%v] want [%v]", got, want) } - if got, want := m.Position.String(), ":2:3"; got != want { - t.Errorf("got [%v] want [%v]", got, want) - } if got, want := len(m.Elements), 6; got != want { t.Errorf("got [%v] want [%v]", got, want) } diff --git a/option.go b/option.go index d16c1ab..c89d95a 100644 --- a/option.go +++ b/option.go @@ -73,9 +73,9 @@ func (o *Option) keyValuePair(embedded bool) (cols []aligned) { // parse reads an Option body // ( ident | "(" fullIdent ")" ) { "." ident } "=" constant ";" func (o *Option) parse(p *Parser) error { - pos, tok, lit := p.next() + pos, tok, lit := p.nextIdentifier() if tLEFTPAREN == tok { - pos, tok, lit = p.next() + pos, tok, lit = p.nextIdentifier() if tok != tIDENT { if !isKeyword(tok) { return p.unexpected(lit, "option full identifier", o) @@ -96,15 +96,15 @@ func (o *Option) parse(p *Parser) error { o.Name = lit } pos, tok, lit = p.next() - if tDOT == tok { - // extend identifier - pos, tok, lit = p.next() - if tok != tIDENT { - return p.unexpected(lit, "option postfix identifier", o) - } - o.Name = fmt.Sprintf("%s.%s", o.Name, lit) - pos, tok, lit = p.next() - } + // if tDOT == tok { + // // extend identifier + // pos, tok, lit = p.nextIdentifier() + // if tok != tIDENT { + // return p.unexpected(lit, "option postfix identifier", o) + // } + // o.Name = fmt.Sprintf("%s.%s", o.Name, lit) + // pos, tok, lit = p.next() + // } if tEQUALS != tok { return p.unexpected(lit, "option constant =", o) } @@ -161,6 +161,15 @@ func (l Literal) String() string { // parse expects to read a literal constant after =. func (l *Literal) parse(p *Parser) error { pos, _, lit := p.next() + if "-" == lit { + // negative number + if err := l.parse(p); err != nil { + return err + } + // modify source and position + l.Position, l.Source = pos, "-"+l.Source + return nil + } source := lit isString := isString(lit) if isString {