type lexer struct {
// source
- bin *bufio.Reader
+ bin *bufio.Reader
+ prevlineno int32 // line no. of most recently read character
nlsemi bool // if set, '\n' and EOF translate to ';'
switch c {
case EOF:
- l.ungetr(EOF) // return EOF again in future next call
+ l.ungetr()
// Treat EOF as "end of line" for the purposes
// of inserting a semicolon.
if nlsemi {
case '.':
c1 = l.getr()
if isDigit(c1) {
- l.ungetr(c1)
+ l.ungetr()
l.number('.')
return
}
goto lx
}
- l.ungetr(c1)
+ l.ungetr()
c1 = '.'
}
c = l.getlinepragma()
for {
if c == '\n' || c == EOF {
- l.ungetr(c)
+ l.ungetr()
goto l0
}
goto l0
}
- l.ungetr(c1)
+ l.ungetr()
lx:
if Debug['x'] != 0 {
c1 = l.getr()
binop1:
if c1 != '=' {
- l.ungetr(c1)
+ l.ungetr()
l.op = op
l.prec = prec
goto lx
}
cp = nil
- l.ungetr(c)
+ l.ungetr()
name := lexbuf.Bytes()
}
}
- l.ungetr(c)
+ l.ungetr()
if isInt {
if malformedOctal {
if c := l.getr(); c != '\'' {
Yyerror("missing '")
- l.ungetr(c)
+ l.ungetr()
}
x := new(Mpint)
func (l *lexer) getr() rune {
redo:
+ l.prevlineno = lexlineno
r, w, err := l.bin.ReadRune()
if err != nil {
if err != io.EOF {
return r
}
-func (l *lexer) ungetr(r rune) {
+func (l *lexer) ungetr() {
l.bin.UnreadRune()
- if r == '\n' && importpkg == nil {
- lexlineno--
- }
+ lexlineno = l.prevlineno
}
// onechar lexes a single character within a rune or interpreted string literal,
switch c {
case EOF:
Yyerror("eof in string")
- l.ungetr(EOF)
+ l.ungetr()
return
case '\n':
Yyerror("newline in string")
- l.ungetr('\n')
+ l.ungetr()
return
case '\\':
}
Yyerror("non-octal character in escape sequence: %c", c)
- l.ungetr(c)
+ l.ungetr()
}
if x > 255 {
d = uint32(c - 'A' + 10)
default:
Yyerror("non-hex character in escape sequence: %c", c)
- l.ungetr(c)
+ l.ungetr()
return x
}
x = x*16 + d