p.errorf("illegal use of register list")
}
p.registerList(a)
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
}
}
// fmt.Printf("REG %s\n", obj.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
a.Type = obj.TYPE_FCONST
a.Val = p.floatExpr()
// fmt.Printf("FCONST %s\n", obj.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
if p.have(scanner.String) {
a.Type = obj.TYPE_SCONST
a.Val = str
// fmt.Printf("SCONST %s\n", obj.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
a.Offset = int64(p.expr())
a.Type = obj.TYPE_MEM
}
// fmt.Printf("CONST %d %s\n", a.Offset, obj.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
// fmt.Printf("offset %d \n", a.Offset)
p.registerIndirect(a, prefix)
// fmt.Printf("DONE %s\n", p.arch.Dconv(&emptyProg, 0, a))
- p.expect(scanner.EOF)
+ p.expectOperandEnd()
return true
}
// get verifies that the next item has the expected type and returns it.
func (p *Parser) get(expected lex.ScanToken) lex.Token {
- p.expect(expected)
+ p.expect(expected, expected.String())
return p.next()
}
+// expectOperandEnd verifies that the parsing state is properly at the end of an operand.
+func (p *Parser) expectOperandEnd() {
+ p.expect(scanner.EOF, "end of operand")
+}
+
// expect verifies that the next item has the expected type. It does not consume it.
-func (p *Parser) expect(expected lex.ScanToken) {
- if p.peek() != expected {
- p.errorf("expected %s, found %s", expected, p.next())
+func (p *Parser) expect(expectedToken lex.ScanToken, expectedMessage string) {
+ if p.peek() != expectedToken {
+ p.errorf("expected %s, found %s", expectedMessage, p.next())
}
}
{"TEXT", "%", "expect two or three operands for TEXT"},
{"TEXT", "1, 1", "TEXT symbol \"<erroneous symbol>\" must be a symbol(SB)"},
{"TEXT", "$\"foo\", 0, $1", "TEXT symbol \"<erroneous symbol>\" must be a symbol(SB)"},
- {"TEXT", "$0É:0, 0, $1", "expected EOF, found É"}, // Issue #12467.
- {"TEXT", "$:0:(SB, 0, $1", "expected '(', found 0"}, // Issue 12468.
+ {"TEXT", "$0É:0, 0, $1", "expected end of operand, found É"}, // Issue #12467.
+ {"TEXT", "$:0:(SB, 0, $1", "expected '(', found 0"}, // Issue 12468.
{"FUNCDATA", "", "expect two operands for FUNCDATA"},
{"FUNCDATA", "(SB ", "expect two operands for FUNCDATA"},
{"DATA", "", "expect two operands for DATA"},
peekText string
}
-// NewInput returns a
+// NewInput returns an Input from the given path.
func NewInput(name string) *Input {
return &Input{
// include directories: look in source dir, then -I directories.
input := NewInput(name)
fd, err := os.Open(name)
if err != nil {
- log.Fatalf("asm: %s\n", err)
+ log.Fatalf("%s\n", err)
}
input.Push(NewTokenizer(name, fd, fd))
return input
architecture := arch.Set(GOARCH)
if architecture == nil {
- log.Fatalf("asm: unrecognized architecture %s", GOARCH)
+ log.Fatalf("unrecognized architecture %s", GOARCH)
}
flags.Parse()
obj.Writeobjdirect(ctxt, output)
}
if !ok || diag {
- log.Printf("asm: assembly of %s failed", flag.Arg(0))
+ log.Printf("assembly of %s failed", flag.Arg(0))
os.Remove(*flags.OutputFile)
os.Exit(1)
}