Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
go
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
go
Commits
58ba20b5
Commit
58ba20b5
authored
Aug 11, 2008
by
Robert Griesemer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- allow reserved words as field and method names
R=r OCL=14102 CL=14102
parent
a8a9dbc9
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
46 additions
and
48 deletions
+46
-48
usr/gri/gosrc/base.go
usr/gri/gosrc/base.go
+8
-1
usr/gri/gosrc/export.go
usr/gri/gosrc/export.go
+1
-1
usr/gri/gosrc/import.go
usr/gri/gosrc/import.go
+1
-1
usr/gri/gosrc/object.go
usr/gri/gosrc/object.go
+2
-1
usr/gri/gosrc/parser.go
usr/gri/gosrc/parser.go
+28
-41
usr/gri/gosrc/printer.go
usr/gri/gosrc/printer.go
+1
-1
usr/gri/gosrc/scanner.go
usr/gri/gosrc/scanner.go
+5
-2
No files found.
usr/gri/gosrc/base.go
View file @
58ba20b5
...
...
@@ -13,5 +13,12 @@ export type Bar *float;
export
type
Node
struct
{
left
,
right
*
Node
;
val
bool
;
f
Foo
f
Foo
;
const
,
type
,
var
,
package
int
;
}
export
func
(
p
*
Node
)
case
(
x
int
)
{};
export
type
I
interface
{
func
();
}
usr/gri/gosrc/export.go
View file @
58ba20b5
...
...
@@ -231,7 +231,7 @@ func (E *Exporter) WriteObject(obj *Globals.Object) {
case
Object
.
CONST
:
E
.
WriteInt
(
0
);
// should be the correct value
case
Object
.
VAR
:
case
Object
.
VAR
,
Object
.
FIELD
:
E
.
WriteInt
(
0
);
// should be the correct address/offset
case
Object
.
FUNC
:
...
...
usr/gri/gosrc/import.go
View file @
58ba20b5
...
...
@@ -260,7 +260,7 @@ func (I *Importer) ReadObject() *Globals.Object {
case
Object
.
CONST
:
I
.
ReadInt
();
// should set the value field
case
Object
.
VAR
:
case
Object
.
VAR
,
Object
.
FIELD
:
I
.
ReadInt
();
// should set the address/offset field
case
Object
.
FUNC
:
...
...
usr/gri/gosrc/object.go
View file @
58ba20b5
...
...
@@ -9,7 +9,7 @@ import Globals "globals"
export
const
/* kind */
(
BAD
=
iota
;
// error handling
CONST
;
TYPE
;
VAR
;
FUNC
;
PACKAGE
;
LABEL
;
CONST
;
TYPE
;
VAR
;
F
IELD
;
F
UNC
;
PACKAGE
;
LABEL
;
END
;
// end of scope (import/export only)
)
...
...
@@ -25,6 +25,7 @@ export func KindStr(kind int) string {
case
CONST
:
return
"CONST"
;
case
TYPE
:
return
"TYPE"
;
case
VAR
:
return
"VAR"
;
case
FIELD
:
return
"FIELD"
;
case
FUNC
:
return
"FUNC"
;
case
PACKAGE
:
return
"PACKAGE"
;
case
LABEL
:
return
"LABEL"
;
...
...
usr/gri/gosrc/parser.go
View file @
58ba20b5
...
...
@@ -246,12 +246,13 @@ func (P *Parser) TryStatement() bool;
func
(
P
*
Parser
)
ParseDeclaration
();
func
(
P
*
Parser
)
ParseIdent
()
(
pos
int
,
ident
string
)
{
func
(
P
*
Parser
)
ParseIdent
(
allow_keyword
bool
)
(
pos
int
,
ident
string
)
{
P
.
Trace
(
"Ident"
);
pos
=
P
.
pos
;
ident
=
""
;
if
P
.
tok
==
Scanner
.
IDENT
{
pos
,
ident
=
P
.
pos
,
""
;
// NOTE Can make this faster by not doing the keyword lookup in the
// scanner if we don't care about keywords.
if
P
.
tok
==
Scanner
.
IDENT
||
allow_keyword
&&
P
.
tok
>
Scanner
.
IDENT
{
ident
=
P
.
val
;
if
P
.
verbose
{
P
.
PrintIndent
();
...
...
@@ -270,7 +271,7 @@ func (P *Parser) ParseIdent() (pos int, ident string) {
func
(
P
*
Parser
)
ParseIdentDecl
(
kind
int
)
*
Globals
.
Object
{
P
.
Trace
(
"IdentDecl"
);
pos
,
ident
:=
P
.
ParseIdent
();
pos
,
ident
:=
P
.
ParseIdent
(
kind
==
Object
.
FIELD
);
obj
:=
Globals
.
NewObject
(
pos
,
kind
,
ident
);
P
.
Declare
(
obj
);
...
...
@@ -296,10 +297,10 @@ func (P *Parser) ParseIdentDeclList(kind int) *Globals.List {
func
(
P
*
Parser
)
ParseIdentList
()
{
P
.
Trace
(
"IdentList"
);
P
.
ParseIdent
();
P
.
ParseIdent
(
false
);
for
P
.
tok
==
Scanner
.
COMMA
{
P
.
Next
();
P
.
ParseIdent
();
P
.
ParseIdent
(
false
);
}
P
.
Ecart
();
}
...
...
@@ -309,7 +310,7 @@ func (P *Parser) ParseQualifiedIdent(pos int, ident string) *Globals.Object {
P
.
Trace
(
"QualifiedIdent"
);
if
pos
<
0
{
pos
,
ident
=
P
.
ParseIdent
();
pos
,
ident
=
P
.
ParseIdent
(
false
);
}
if
P
.
semantic_checks
{
...
...
@@ -328,7 +329,7 @@ func (P *Parser) ParseQualifiedIdent(pos int, ident string) *Globals.Object {
// panic "pkg.obj.ident != ident";
//}
P
.
Next
();
// consume "."
pos
,
ident
=
P
.
ParseIdent
();
pos
,
ident
=
P
.
ParseIdent
(
false
);
obj
=
pkg
.
scope
.
Lookup
(
ident
);
if
obj
==
nil
{
P
.
Error
(
pos
,
`"`
+
ident
+
`" is not declared in package "`
+
pkg
.
obj
.
ident
+
`"`
);
...
...
@@ -342,7 +343,7 @@ func (P *Parser) ParseQualifiedIdent(pos int, ident string) *Globals.Object {
}
else
{
if
P
.
tok
==
Scanner
.
PERIOD
{
P
.
Next
();
P
.
ParseIdent
();
P
.
ParseIdent
(
false
);
}
P
.
Ecart
();
return
nil
;
...
...
@@ -453,10 +454,10 @@ func (P *Parser) ParseChannelType() *Globals.Type {
}
func
(
P
*
Parser
)
ParseVarDeclList
()
{
func
(
P
*
Parser
)
ParseVarDeclList
(
kind
int
)
{
P
.
Trace
(
"VarDeclList"
);
list
:=
P
.
ParseIdentDeclList
(
Object
.
VAR
);
list
:=
P
.
ParseIdentDeclList
(
kind
);
typ
:=
P
.
ParseVarType
();
for
p
:=
list
.
first
;
p
!=
nil
;
p
=
p
.
next
{
p
.
obj
.
typ
=
typ
;
// TODO should use/have set_type()
...
...
@@ -466,20 +467,13 @@ func (P *Parser) ParseVarDeclList() {
}
func
(
P
*
Parser
)
ParseParameterSection
()
{
P
.
Trace
(
"ParameterSection"
);
P
.
ParseVarDeclList
();
P
.
Ecart
();
}
func
(
P
*
Parser
)
ParseParameterList
()
{
P
.
Trace
(
"ParameterList"
);
P
.
Parse
ParameterSection
(
);
P
.
Parse
VarDeclList
(
Object
.
VAR
);
for
P
.
tok
==
Scanner
.
COMMA
{
P
.
Next
();
P
.
Parse
ParameterSection
(
);
P
.
Parse
VarDeclList
(
Object
.
VAR
);
}
P
.
Ecart
();
...
...
@@ -586,7 +580,7 @@ func (P *Parser) ParseNamedSignature() (pos int, ident string, typ *Globals.Type
}
}
pos
,
ident
=
P
.
ParseIdent
();
pos
,
ident
=
P
.
ParseIdent
(
true
);
P
.
ParseParameters
();
...
...
@@ -614,7 +608,7 @@ func (P *Parser) ParseFunctionType() *Globals.Type {
func
(
P
*
Parser
)
ParseMethodDecl
(
recv_typ
*
Globals
.
Type
)
{
P
.
Trace
(
"MethodDecl"
);
pos
,
ident
:=
P
.
ParseIdent
();
pos
,
ident
:=
P
.
ParseIdent
(
true
);
P
.
OpenScope
();
P
.
level
--
;
sig
:=
P
.
top_scope
;
...
...
@@ -649,7 +643,7 @@ func (P *Parser) ParseInterfaceType() *Globals.Type {
P
.
level
--
;
typ
:=
Globals
.
NewType
(
Type
.
INTERFACE
);
typ
.
scope
=
P
.
top_scope
;
for
P
.
tok
=
=
Scanner
.
IDENT
{
for
P
.
tok
>
=
Scanner
.
IDENT
{
P
.
ParseMethodDecl
(
typ
);
}
P
.
level
++
;
...
...
@@ -676,13 +670,6 @@ func (P *Parser) ParseMapType() *Globals.Type {
}
func
(
P
*
Parser
)
ParseFieldDecl
()
{
P
.
Trace
(
"FieldDecl"
);
P
.
ParseVarDeclList
();
P
.
Ecart
();
}
func
(
P
*
Parser
)
ParseStructType
()
*
Globals
.
Type
{
P
.
Trace
(
"StructType"
);
...
...
@@ -692,8 +679,8 @@ func (P *Parser) ParseStructType() *Globals.Type {
P
.
level
--
;
typ
:=
Globals
.
NewType
(
Type
.
STRUCT
);
typ
.
scope
=
P
.
top_scope
;
for
P
.
tok
=
=
Scanner
.
IDENT
{
P
.
Parse
FieldDecl
(
);
for
P
.
tok
>
=
Scanner
.
IDENT
{
P
.
Parse
VarDeclList
(
Object
.
FIELD
);
if
P
.
tok
!=
Scanner
.
RBRACE
{
P
.
Expect
(
Scanner
.
SEMICOLON
);
}
...
...
@@ -738,7 +725,7 @@ func (P *Parser) ParsePointerType() *Globals.Type {
P
.
Next
();
// consume package name
P
.
Expect
(
Scanner
.
PERIOD
);
pos
,
ident
:=
P
.
ParseIdent
();
pos
,
ident
:=
P
.
ParseIdent
(
false
);
obj
:=
pkg
.
scope
.
Lookup
(
ident
);
if
obj
==
nil
{
elt
=
Globals
.
NewType
(
Type
.
FORWARD
);
...
...
@@ -760,7 +747,7 @@ func (P *Parser) ParsePointerType() *Globals.Type {
if
P
.
Lookup
(
P
.
val
)
==
nil
{
// implicit type forward declaration
// create a named forward type
pos
,
ident
:=
P
.
ParseIdent
();
pos
,
ident
:=
P
.
ParseIdent
(
false
);
obj
:=
Globals
.
NewObject
(
pos
,
Object
.
TYPE
,
ident
);
elt
=
Globals
.
NewType
(
Type
.
FORWARD
);
obj
.
typ
=
elt
;
...
...
@@ -1110,8 +1097,8 @@ func (P *Parser) ParseSelectorOrTypeAssertion(x Globals.Expr) Globals.Expr {
period_pos
:=
P
.
pos
;
P
.
Expect
(
Scanner
.
PERIOD
);
if
P
.
tok
=
=
Scanner
.
IDENT
{
ident_pos
,
ident
:=
P
.
ParseIdent
();
if
P
.
tok
>
=
Scanner
.
IDENT
{
ident_pos
,
ident
:=
P
.
ParseIdent
(
true
);
if
P
.
semantic_checks
{
switch
typ
:=
x
.
typ
();
typ
.
form
{
...
...
@@ -1519,7 +1506,7 @@ func (P *Parser) ParseControlFlowStat(tok int) {
P
.
Expect
(
tok
);
if
P
.
tok
==
Scanner
.
IDENT
{
P
.
ParseIdent
();
P
.
ParseIdent
(
false
);
}
P
.
Ecart
();
...
...
@@ -1659,7 +1646,7 @@ func (P *Parser) ParseCommCase() {
}
else
{
// receive
if
P
.
tok
!=
Scanner
.
LSS
{
P
.
ParseIdent
();
P
.
ParseIdent
(
false
);
P
.
Expect
(
Scanner
.
ASSIGN
);
}
P
.
Expect
(
Scanner
.
LSS
);
...
...
@@ -1831,7 +1818,7 @@ func (P *Parser) ParseTypeSpec(exported bool) {
var
typ
*
Globals
.
Type
;
pos
,
ident
:=
P
.
ParseIdent
();
pos
,
ident
:=
P
.
ParseIdent
(
false
);
obj
:=
P
.
Lookup
(
ident
);
if
!
P
.
comp
.
flags
.
sixg
&&
obj
!=
nil
{
...
...
@@ -1990,7 +1977,7 @@ func (P *Parser) ParseExportDecl() {
has_paren
=
true
;
}
for
P
.
tok
==
Scanner
.
IDENT
{
pos
,
ident
:=
P
.
ParseIdent
();
pos
,
ident
:=
P
.
ParseIdent
(
false
);
P
.
exports
.
AddStr
(
ident
);
P
.
Optional
(
Scanner
.
COMMA
);
// TODO this seems wrong
}
...
...
usr/gri/gosrc/printer.go
View file @
58ba20b5
...
...
@@ -149,7 +149,7 @@ func (P *Printer) PrintObjectStruct(obj *Globals.Object) {
print
" "
;
P
.
PrintTypeStruct
(
obj
.
typ
);
case
Object
.
VAR
:
case
Object
.
VAR
,
Object
.
FIELD
:
if
P
.
level
==
0
{
print
"var "
;
}
...
...
usr/gri/gosrc/scanner.go
View file @
58ba20b5
...
...
@@ -11,7 +11,6 @@ import Utils "utils"
export
const
(
ILLEGAL
=
iota
;
EOF
;
IDENT
;
INT
;
FLOAT
;
STRING
;
...
...
@@ -74,6 +73,9 @@ export const (
LAND
;
LOR
;
// IDENT must be immediately before keywords
IDENT
;
// keywords
KEYWORDS_BEG
;
BREAK
;
...
...
@@ -118,7 +120,6 @@ export func TokenName(tok int) string {
switch
(
tok
)
{
case
ILLEGAL
:
return
"illegal"
;
case
EOF
:
return
"eof"
;
case
IDENT
:
return
"ident"
;
case
INT
:
return
"int"
;
case
FLOAT
:
return
"float"
;
case
STRING
:
return
"string"
;
...
...
@@ -181,6 +182,8 @@ export func TokenName(tok int) string {
case
LAND
:
return
"&&"
;
case
LOR
:
return
"||"
;
case
IDENT
:
return
"ident"
;
case
BREAK
:
return
"break"
;
case
CASE
:
return
"case"
;
case
CHAN
:
return
"chan"
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment