import (
"array";
+ "utf8";
+ "unicode";
Scanner "scanner";
)
-type (
+export type (
Object struct;
Type struct;
}
+func (obj *Object) IsExported() bool {
+ switch obj.kind {
+ case NONE /* FUNC for now */, CONST, TYPE, VAR, FUNC:
+ ch, size := utf8.DecodeRuneInString(obj.ident, 0);
+ return unicode.IsUpper(ch);
+ }
+ return false;
+}
+
export var Universe_void_typ *Type // initialized by Universe to Universe.void_typ
var ObjectId int;
columns bool;
testmode bool;
tokenchan bool;
+ naming bool;
}
h.errpos = pos;
if h.nerrors >= 10 {
- sys.exit(1);
+ // TODO enable when done with name convention
+ //sys.exit(1);
}
}
}
var parser Parser.Parser;
- parser.Open(flags.verbose, flags.sixg, flags.deps, &scanner, tstream);
+ parser.Open(flags.verbose, flags.sixg, flags.deps, flags.naming, &scanner, tstream);
prog := parser.ParseProgram();
export type Parser struct {
// Tracing/debugging
- verbose, sixg, deps bool;
+ verbose, sixg, deps, naming bool;
indent uint;
// Scanner
}
-func (P *Parser) Open(verbose, sixg, deps bool, scanner *Scanner.Scanner, tokchan <-chan *Scanner.Token) {
+func (P *Parser) Open(verbose, sixg, deps, naming bool, scanner *Scanner.Scanner, tokchan <-chan *Scanner.Token) {
P.verbose = verbose;
P.sixg = sixg;
P.deps = deps;
+ P.naming = naming;
P.indent = 0;
P.scanner = scanner;
}
+func (P *Parser) VerifyExport1(p *AST.Expr, exported bool) {
+ obj := p.obj;
+ if exported {
+ if !obj.IsExported() {
+ P.Error(obj.pos, `"` + obj.ident + `" should be uppercase`);
+ }
+ } else if P.scope_lev == 0 {
+ if obj.IsExported() {
+ P.Error(obj.pos, `"` + obj.ident + `" should be lowercase`);
+ }
+ }
+}
+
+
+func (P *Parser) VerifyExport(p *AST.Expr, exported bool) {
+ if !P.naming {
+ return;
+ }
+ for p.tok == Scanner.COMMA {
+ P.VerifyExport1(p.x, exported);
+ p = p.y;
+ }
+ P.VerifyExport1(p, exported);
+}
+
+
+
// ----------------------------------------------------------------------------
// AST support
}
P.Declare(d.ident, AST.CONST);
+ P.VerifyExport(d.ident, exported);
P.Ecart();
return d;
d.typ = P.ParseType();
P.opt_semi = true;
+ P.VerifyExport(d.ident, exported);
+
P.Ecart();
return d;
}
}
P.Declare(d.ident, AST.VAR);
+ P.VerifyExport(d.ident, exported);
P.Ecart();
return d;
P.scope_lev--;
}
+ if recv == nil || exported {
+ P.VerifyExport(d.ident, exported);
+ }
+
P.Ecart();
return d;
}
Flag.BoolVar(&flags.columns, "columns", Platform.USER == "gri", "print column info in error messages");
Flag.BoolVar(&flags.testmode, "t", false, "test mode: interprets /* ERROR */ and /* SYNC */ comments");
Flag.BoolVar(&flags.tokenchan, "token_chan", false, "use token channel for scanner-parser connection");
+ Flag.BoolVar(&flags.naming, "naming", false, "verify export naming scheme");
}
if nerrors > 0 {
return;
}
- if !*silent && !flags.testmode {
+ if !flags.naming && !*silent && !flags.testmode {
Printer.Print(prog);
}
}