package Compilation
-import "array"
-import OS "os"
-import Platform "platform"
-import Scanner "scanner"
-import Parser "parser"
-import AST "ast"
-import TypeChecker "typechecker"
+import (
+ "array";
+ "utf8";
+ OS "os";
+ Platform "platform";
+ Scanner "scanner";
+ Parser "parser";
+ AST "ast";
+ TypeChecker "typechecker";
+)
func assert(b bool) {
}
}
- return line, pos - lpos;
+ return line, utf8.RuneCountInString(src, lpos, pos - lpos);
}
if P.scope_lev < 0 {
panic("cannot declare objects in other packages");
}
- obj := x.obj;
- assert(x.tok == Scanner.IDENT && obj.kind == AST.NONE);
- obj.kind = kind;
- obj.pnolev = P.scope_lev;
- if scope.LookupLocal(obj.ident) != nil {
- P.Error(obj.pos, `"` + obj.ident + `" is declared already`);
- return; // don't insert it into the scope
- }
- scope.Insert(obj);
+ if x.tok != Scanner.ILLEGAL { // ignore bad exprs
+ obj := x.obj;
+ assert(x.tok == Scanner.IDENT && obj.kind == AST.NONE);
+ obj.kind = kind;
+ obj.pnolev = P.scope_lev;
+ if scope.LookupLocal(obj.ident) != nil {
+ P.Error(obj.pos, `"` + obj.ident + `" is declared already`);
+ return; // don't insert it into the scope
+ }
+ scope.Insert(obj);
+ }
}
package Scanner
import "utf8"
+import "unicode"
import Utils "utils"
func is_letter(ch int) bool {
- return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 128 ;
+ return
+ 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || // common case
+ ch == '_' || unicode.IsLetter(ch);
}
)
+var (
+ // Unicode identifiers
+ ä, ö, ü, Á, Ø, Å, ƒ, ß int;
+)
+
+
func d0() {
var (
a string;