1
0
mirror of https://github.com/golang/go synced 2024-11-24 04:20:03 -07:00

cmd/compile/internal/gc: cleaning lex.go

Cleaning along the way:
-convert variable types from int to bool
-remove unnecessary functions
-remove unnecessary type conversion
-remove unnecessary variable declarations
-transform struct{string,string} with lookup to map[string]string

This change passes go build -toolexec 'toolstash -cmp' -a std.

Change-Id: I259728fe4afd7f23b67f08fab856ce0abee57b21
Reviewed-on: https://go-review.googlesource.com/14435
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Marvin Stenger 2015-09-11 00:03:19 +02:00 committed by Ian Lance Taylor
parent 19d262ffdf
commit 211cdf1e00
6 changed files with 120 additions and 153 deletions

View File

@ -382,12 +382,12 @@ type Sig struct {
type Io struct {
infile string
bin *obj.Biobuf
nlsemi int
eofnl int
cp string // used for content when bin==nil
last int
peekc int
peekc1 int // second peekc for ...
cp string // used for content when bin==nil
peekc1 int // second peekc for ...
nlsemi bool
eofnl bool
importsafe bool
}
@ -598,7 +598,7 @@ var incannedimport int
var statuniqgen int // name generator for static temps
var loophack int
var loophack bool
var iota_ int32

View File

@ -2311,6 +2311,6 @@ func fixlbrace(lbr int) {
// set up for another one now that we're done.
// See comment in lex.C about loophack.
if lbr == LBODY {
loophack = 1
loophack = true
}
}

View File

@ -26,7 +26,7 @@ var yyprev int
var yylast int
var imported_unsafe int
var imported_unsafe bool
var (
goos string
@ -60,26 +60,6 @@ var debugtab = []struct {
{"wb", &Debug_wb}, // print information about write barriers
}
// Our own isdigit, isspace, isalpha, isalnum that take care
// of EOF and other out of range arguments.
func yy_isdigit(c int) bool {
return c >= 0 && c <= 0xFF && isdigit(c)
}
func yy_isspace(c int) bool {
return c == ' ' || c == '\t' || c == '\n' || c == '\r'
}
func yy_isalpha(c int) bool {
return 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z'
}
func yy_isalnum(c int) bool {
return c >= 0 && c <= 0xFF && isalnum(c)
}
// Disallow use of isdigit etc.
const (
EOF = -1
)
@ -334,8 +314,8 @@ func Main() {
curio.peekc = 0
curio.peekc1 = 0
curio.nlsemi = 0
curio.eofnl = 0
curio.nlsemi = false
curio.eofnl = false
curio.last = 0
// Skip initial BOM if present.
@ -346,7 +326,7 @@ func Main() {
block = 1
iota_ = -1000000
imported_unsafe = 0
imported_unsafe = false
yyparse()
if nsyntaxerrors != 0 {
@ -587,7 +567,7 @@ func addidir(dir string) {
// is this path a local name? begins with ./ or ../ or /
func islocalname(name string) bool {
return strings.HasPrefix(name, "/") ||
Ctxt.Windows != 0 && len(name) >= 3 && yy_isalpha(int(name[0])) && name[1] == ':' && name[2] == '/' ||
Ctxt.Windows != 0 && len(name) >= 3 && isAlpha(int(name[0])) && name[1] == ':' && name[2] == '/' ||
strings.HasPrefix(name, "./") || name == "." ||
strings.HasPrefix(name, "../") || name == ".."
}
@ -702,7 +682,7 @@ func importfile(f *Val, line int) {
importpkg = mkpkg(f.U.(string))
cannedimports("unsafe.o", unsafeimport)
imported_unsafe = 1
imported_unsafe = true
return
}
@ -803,19 +783,18 @@ func importfile(f *Val, line int) {
curio.peekc = 0
curio.peekc1 = 0
curio.infile = file
curio.nlsemi = 0
curio.nlsemi = false
typecheckok = true
var c int32
for {
c = int32(getc())
c := getc()
if c == EOF {
break
}
if c != '$' {
continue
}
c = int32(getc())
c = getc()
if c == EOF {
break
}
@ -854,7 +833,7 @@ func cannedimports(file string, cp string) {
curio.peekc1 = 0
curio.infile = file
curio.cp = cp
curio.nlsemi = 0
curio.nlsemi = false
curio.importsafe = false
typecheckok = true
@ -864,7 +843,7 @@ func cannedimports(file string, cp string) {
func isfrog(c int) bool {
// complain about possibly invisible control characters
if c < ' ' {
return !yy_isspace(c) // exclude good white space
return !isSpace(c) // exclude good white space
}
if 0x7f <= c && c <= 0xa0 { // DEL, unicode block including unbreakable space.
@ -874,8 +853,8 @@ func isfrog(c int) bool {
}
type Loophack struct {
v int
next *Loophack
v bool
}
var _yylex_lstk *Loophack
@ -885,7 +864,6 @@ func _yylex(yylval *yySymType) int32 {
var escflag int
var v int64
var cp *bytes.Buffer
var rune_ uint
var s *Sym
var h *Loophack
var str string
@ -894,8 +872,8 @@ func _yylex(yylval *yySymType) int32 {
l0:
c := getc()
if yy_isspace(c) {
if c == '\n' && curio.nlsemi != 0 {
if isSpace(c) {
if c == '\n' && curio.nlsemi {
ungetc(c)
if Debug['x'] != 0 {
fmt.Printf("lex: implicit semi\n")
@ -916,20 +894,20 @@ l0:
goto talph
}
if yy_isalpha(c) {
if isAlpha(c) {
cp = &lexbuf
cp.Reset()
goto talph
}
if yy_isdigit(c) {
if isDigit(c) {
cp = &lexbuf
cp.Reset()
if c != '0' {
for {
cp.WriteByte(byte(c))
c = getc()
if yy_isdigit(c) {
if isDigit(c) {
continue
}
if c == '.' {
@ -951,7 +929,7 @@ l0:
for {
cp.WriteByte(byte(c))
c = getc()
if yy_isdigit(c) {
if isDigit(c) {
continue
}
if c >= 'a' && c <= 'f' {
@ -976,7 +954,7 @@ l0:
c1 = 0
for {
if !yy_isdigit(c) {
if !isDigit(c) {
break
}
if c < '0' || c > '7' {
@ -1014,7 +992,7 @@ l0:
case '.':
c1 = getc()
if yy_isdigit(c1) {
if isDigit(c1) {
cp = &lexbuf
cp.Reset()
cp.WriteByte(byte(c))
@ -1048,8 +1026,7 @@ l0:
if v < utf8.RuneSelf || escflag != 0 {
cp.WriteByte(byte(v))
} else {
rune_ = uint(v)
cp.WriteRune(rune(rune_))
cp.WriteRune(rune(v))
}
}
@ -1106,23 +1083,23 @@ l0:
case '/':
c1 = getc()
if c1 == '*' {
nl := 0
nl := false
for {
c = int(getr())
if c == '\n' {
nl = 1
nl = true
}
for c == '*' {
c = int(getr())
if c == '/' {
if nl != 0 {
if nl {
ungetc('\n')
}
goto l0
}
if c == '\n' {
nl = 1
nl = true
}
}
@ -1308,15 +1285,15 @@ l0:
*
* when we see the keyword, the next
* non-parenthesized '{' becomes an LBODY.
* loophack is normally 0.
* a keyword makes it go up to 1.
* parens push loophack onto a stack and go back to 0.
* a '{' with loophack == 1 becomes LBODY and disables loophack.
* loophack is normally false.
* a keyword sets it to true.
* parens push loophack onto a stack and go back to false.
* a '{' with loophack == true becomes LBODY and disables loophack.
*
* i said it was clumsy.
*/
case '(', '[':
if loophack != 0 || _yylex_lstk != nil {
if loophack || _yylex_lstk != nil {
h = new(Loophack)
if h == nil {
Flusherrors()
@ -1327,7 +1304,7 @@ l0:
h.v = loophack
h.next = _yylex_lstk
_yylex_lstk = h
loophack = 0
loophack = false
}
goto lx
@ -1342,11 +1319,11 @@ l0:
goto lx
case '{':
if loophack == 1 {
if loophack {
if Debug['x'] != 0 {
fmt.Printf("%v lex: LBODY\n", Ctxt.Line(int(lexlineno)))
}
loophack = 0
loophack = false
return LBODY
}
@ -1395,14 +1372,14 @@ talph:
for {
if c >= utf8.RuneSelf {
ungetc(c)
rune_ = uint(getr())
r := rune(getr())
// 0xb7 · is used for internal names
if !unicode.IsLetter(rune(rune_)) && !unicode.IsDigit(rune(rune_)) && (importpkg == nil || rune_ != 0xb7) {
Yyerror("invalid identifier character U+%04x", rune_)
if !unicode.IsLetter(r) && !unicode.IsDigit(r) && (importpkg == nil || r != 0xb7) {
Yyerror("invalid identifier character U+%04x", r)
}
cp.WriteRune(rune(rune_))
} else if !yy_isalnum(c) && c != '_' {
cp.WriteRune(r)
} else if !isAlnum(c) && c != '_' {
break
} else {
cp.WriteByte(byte(c))
@ -1419,7 +1396,7 @@ talph:
goto l0
case LFOR, LIF, LSWITCH, LSELECT:
loophack = 1 // see comment about loophack above
loophack = true // see comment about loophack above
}
if Debug['x'] != 0 {
@ -1450,7 +1427,7 @@ casedot:
for {
cp.WriteByte(byte(c))
c = getc()
if !yy_isdigit(c) {
if !isDigit(c) {
break
}
}
@ -1475,10 +1452,10 @@ caseep:
c = getc()
}
if !yy_isdigit(c) {
if !isDigit(c) {
Yyerror("malformed floating point constant exponent")
}
for yy_isdigit(c) {
for isDigit(c) {
cp.WriteByte(byte(c))
c = getc()
}
@ -1548,7 +1525,7 @@ func internString(b []byte) string {
func more(pp *string) bool {
p := *pp
for p != "" && yy_isspace(int(p[0])) {
for p != "" && isSpace(int(p[0])) {
p = p[1:]
}
*pp = p
@ -1594,7 +1571,7 @@ func getlinepragma() int {
}
if verb == "go:linkname" {
if imported_unsafe == 0 {
if !imported_unsafe {
Yyerror("//go:linkname only allowed in Go files that import \"unsafe\"")
}
f := strings.Fields(cmd)
@ -1711,7 +1688,7 @@ func getimpsym(pp *string) string {
return ""
}
i := 0
for i < len(p) && !yy_isspace(int(p[i])) && p[i] != '"' {
for i < len(p) && !isSpace(int(p[i])) && p[i] != '"' {
i++
}
sym := p[:i]
@ -1746,9 +1723,7 @@ func pragcgo(text string) {
verb := text[3:] // skip "go:"
if verb == "cgo_dynamic_linker" || verb == "dynlinker" {
var ok bool
var p string
p, ok = getquoted(&q)
p, ok := getquoted(&q)
if !ok {
Yyerror("usage: //go:cgo_dynamic_linker \"path\"")
return
@ -1830,9 +1805,7 @@ func pragcgo(text string) {
}
if verb == "cgo_ldflag" {
var ok bool
var p string
p, ok = getquoted(&q)
p, ok := getquoted(&q)
if !ok {
Yyerror("usage: //go:cgo_ldflag \"arg\"")
return
@ -1866,7 +1839,7 @@ func yyparse() {
func yylex(yylval *yySymType) int32 {
lx := int(_yylex(yylval))
if curio.nlsemi != 0 && lx == EOF {
if curio.nlsemi && lx == EOF {
// Treat EOF as "end of line" for the purposes
// of inserting a semicolon.
lx = ';'
@ -1884,10 +1857,10 @@ func yylex(yylval *yySymType) int32 {
')',
'}',
']':
curio.nlsemi = 1
curio.nlsemi = true
default:
curio.nlsemi = 0
curio.nlsemi = false
}
// Track last two tokens returned by yylex.
@ -1942,10 +1915,10 @@ check:
// insert \n at EOF
case EOF:
if curio.eofnl != 0 || curio.last == '\n' {
if curio.eofnl || curio.last == '\n' {
return EOF
}
curio.eofnl = 1
curio.eofnl = true
c = '\n'
fallthrough
@ -2505,77 +2478,67 @@ func lexname(lex int) string {
return fmt.Sprintf("LEX-%d", lex)
}
var yytfix = []struct {
have string
want string
}{
{"$end", "EOF"},
{"LASOP", "op="},
{"LBREAK", "break"},
{"LCASE", "case"},
{"LCHAN", "chan"},
{"LCOLAS", ":="},
{"LCONST", "const"},
{"LCONTINUE", "continue"},
{"LDDD", "..."},
{"LDEFAULT", "default"},
{"LDEFER", "defer"},
{"LELSE", "else"},
{"LFALL", "fallthrough"},
{"LFOR", "for"},
{"LFUNC", "func"},
{"LGO", "go"},
{"LGOTO", "goto"},
{"LIF", "if"},
{"LIMPORT", "import"},
{"LINTERFACE", "interface"},
{"LMAP", "map"},
{"LNAME", "name"},
{"LPACKAGE", "package"},
{"LRANGE", "range"},
{"LRETURN", "return"},
{"LSELECT", "select"},
{"LSTRUCT", "struct"},
{"LSWITCH", "switch"},
{"LTYPE", "type"},
{"LVAR", "var"},
{"LANDAND", "&&"},
{"LANDNOT", "&^"},
{"LBODY", "{"},
{"LCOMM", "<-"},
{"LDEC", "--"},
{"LINC", "++"},
{"LEQ", "=="},
{"LGE", ">="},
{"LGT", ">"},
{"LLE", "<="},
{"LLT", "<"},
{"LLSH", "<<"},
{"LRSH", ">>"},
{"LOROR", "||"},
{"LNE", "!="},
var yytfix = map[string]string{
"$end": "EOF",
"LASOP": "op=",
"LBREAK": "break",
"LCASE": "case",
"LCHAN": "chan",
"LCOLAS": ":=",
"LCONST": "const",
"LCONTINUE": "continue",
"LDDD": "...",
"LDEFAULT": "default",
"LDEFER": "defer",
"LELSE": "else",
"LFALL": "fallthrough",
"LFOR": "for",
"LFUNC": "func",
"LGO": "go",
"LGOTO": "goto",
"LIF": "if",
"LIMPORT": "import",
"LINTERFACE": "interface",
"LMAP": "map",
"LNAME": "name",
"LPACKAGE": "package",
"LRANGE": "range",
"LRETURN": "return",
"LSELECT": "select",
"LSTRUCT": "struct",
"LSWITCH": "switch",
"LTYPE": "type",
"LVAR": "var",
"LANDAND": "&&",
"LANDNOT": "&^",
"LBODY": "{",
"LCOMM": "<-",
"LDEC": "--",
"LINC": "++",
"LEQ": "==",
"LGE": ">=",
"LGT": ">",
"LLE": "<=",
"LLT": "<",
"LLSH": "<<",
"LRSH": ">>",
"LOROR": "||",
"LNE": "!=",
// spell out to avoid confusion with punctuation in error messages
{"';'", "semicolon or newline"},
{"','", "comma"},
"';'": "semicolon or newline",
"','": "comma",
}
func init() {
yyErrorVerbose = true
Outer:
for i, s := range yyToknames {
// Apply yytfix if possible.
for _, fix := range yytfix {
if s == fix.have {
yyToknames[i] = fix.want
continue Outer
}
}
// Turn 'x' into x.
if len(s) == 3 && s[0] == '\'' && s[2] == '\'' {
if fix, ok := yytfix[s]; ok {
yyToknames[i] = fix
} else if len(s) == 3 && s[0] == '\'' && s[2] == '\'' {
// Turn 'x' into x.
yyToknames[i] = s[1:2]
continue
}
}
}

View File

@ -122,7 +122,7 @@ func Yyerror(format string, args ...interface{}) {
// An unexpected EOF caused a syntax error. Use the previous
// line number since getc generated a fake newline character.
if curio.eofnl != 0 {
if curio.eofnl {
lexlineno = prevlineno
}

View File

@ -18,15 +18,19 @@ func atoi(s string) int {
return int(n)
}
func isalnum(c int) bool {
return isalpha(c) || isdigit(c)
func isSpace(c int) bool {
return c == ' ' || c == '\t' || c == '\n' || c == '\r'
}
func isalpha(c int) bool {
func isAlnum(c int) bool {
return isAlpha(c) || isDigit(c)
}
func isAlpha(c int) bool {
return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z'
}
func isdigit(c int) bool {
func isDigit(c int) bool {
return '0' <= c && c <= '9'
}

View File

@ -160,7 +160,7 @@ func fixlbrace(lbr int) {
// set up for another one now that we're done.
// See comment in lex.C about loophack.
if lbr == LBODY {
loophack = 1
loophack = true
}
}