📄 parser.java
字号:
s = new BitSet(128);
if (t.kind == 1) {
Get();
c = Tab.ClassWithName(token.val);
if (c < 0) SemError(15); else s.or(Tab.Class(c));
} else if (t.kind == 2) {
Get();
name = token.val;
for (int i = 1; name.charAt(i) != name.charAt(0); i++)
if (ignoreCase) s.set((int) Character.toUpperCase(name.charAt(i)));
else s.set((int) name.charAt(i));
} else if (t.kind == 24) {
n1 = SingleChar();
s.set(n1);
if (t.kind == 22) {
Get();
n2 = SingleChar();
for (int i = n1; i <= n2; i++) s.set(i);
}
} else if (t.kind == 23) {
Get();
s = Sets.FullSet(127);
} else Error(52);
return s;
}
private static BitSet Set() {
BitSet s;
BitSet s2;
s = SimSet();
while (t.kind == 20 || t.kind == 21) {
if (t.kind == 20) {
Get();
s2 = SimSet();
s.or(s2);
} else {
Get();
s2 = SimSet();
Sets.Differ(s, s2);
}
}
return s;
}
private static Graph TokenExpr() {
Graph g;
Graph g2; boolean first;
g = TokenTerm();
first = true;
while (WeakSeparator(35, 5, 13)) {
g2 = TokenTerm();
if (first) {g = Tab.FirstAlt(g); first = false;}
g = Tab.Alternative(g, g2);
}
return g;
}
private static void NameDecl() {
String alias, str = new String();
Expect(1);
alias = token.val;
Expect(7);
if (t.kind == 1) {
Get();
str = token.val;
} else if (t.kind == 2) {
Get();
str = FixString(token.val);
} else Error(53);
Tab.NewName(alias, str);
Expect(8);
}
private static void TokenDecl(int typ) {
SymInfo s; int sp; Position pos; Graph g;
s = Symbol();
if (Tab.FindSym(s.name) != Tab.noSym) {SemError(7); sp = 0;}
else {
sp = Tab.NewSym(typ, s.name, token.line);
Tab.Sym(sp).struct = Tab.classToken;
}
while (!(StartOf(14))) {Error(54); Get();}
if (t.kind == 7) {
Get();
g = TokenExpr();
if (s.kind != ident) SemError(13);
Tab.CompleteGraph(g.r);
DFA.ConvertToStates(g.l, sp);
Expect(8);
} else if (StartOf(15)) {
if (s.kind == ident) genScanner = false;
else MatchLiteral(sp);
} else Error(55);
if (t.kind == 41) {
pos = SemText();
if (typ == Tab.t) SemError(14);
Tab.Sym(sp).semPos = pos;
}
}
private static void SetDecl() {
int c; BitSet s; String name;
Expect(1);
name = token.val;
c = Tab.ClassWithName(name);
if (c >= 0) SemError(7);
Expect(7);
s = Set();
c = Tab.NewClass(name, s);
Expect(8);
}
private static Graph Expression() {
Graph g;
Graph g2; boolean first;
g = Term();
first = true;
while (WeakSeparator(35, 16, 17)) {
g2 = Term();
if (first) {g = Tab.FirstAlt(g); first = false;}
g = Tab.Alternative(g, g2);
}
return g;
}
private static Position SemText() {
Position pos;
Expect(41);
pos = new Position();
pos.beg = t.pos; pos.col = t.col;
while (StartOf(18)) {
if (StartOf(19)) {
Get();
} else if (t.kind == 3) {
Get();
SemError(2);
} else {
Get();
SemError(9);
}
}
Expect(42);
pos.len = token.pos - pos.beg;
return pos;
}
private static void AttrDecl1(Symbol sym) {
int beg, col, dim; StringBuffer buf;
Expect(33);
if (t.kind == 28) {
Get();
Expect(1);
buf = new StringBuffer(token.val); dim = 0;
while (t.kind == 29) {
Get();
Expect(30);
dim++;
}
Expect(1);
sym.retVar = token.val;
while (t.kind == 29) {
Get();
Expect(30);
dim++;
}
while (dim > 0) { buf.append("[]"); dim--; }
sym.retType = buf.toString();
if (t.kind == 31) {
Get();
}
}
beg = t.pos; col = t.col;
while (StartOf(1)) {
if (StartOf(2)) {
Get();
} else {
Get();
SemError(2);
}
}
Expect(34);
if (token.pos > beg) {
sym.attrPos = new Position();
sym.attrPos.beg = beg; sym.attrPos.col = col;
sym.attrPos.len = token.pos - beg;
}
}
private static void AttrDecl(Symbol sym) {
int beg, col, dim; StringBuffer buf;
Expect(27);
if (t.kind == 28) {
Get();
Expect(1);
buf = new StringBuffer(token.val); dim = 0;
while (t.kind == 29) {
Get();
Expect(30);
dim++;
}
Expect(1);
sym.retVar = token.val;
while (t.kind == 29) {
Get();
Expect(30);
dim++;
}
while (dim > 0) { buf.append("[]"); dim--; }
sym.retType = buf.toString();
if (t.kind == 31) {
Get();
}
}
beg = t.pos; col = t.col;
while (StartOf(3)) {
if (StartOf(4)) {
Get();
} else {
Get();
SemError(2);
}
}
Expect(32);
if (token.pos > beg) {
sym.attrPos = new Position();
sym.attrPos.beg = beg; sym.attrPos.col = col;
sym.attrPos.len = token.pos - beg;
}
}
private static void Declaration() {
Graph g1, g2; boolean nested = false;
switch (t.kind) {
case 10: {
Get();
while (t.kind == 1) {
SetDecl();
}
break;
}
case 11: {
Get();
while (t.kind == 1 || t.kind == 2) {
TokenDecl(Tab.t);
}
break;
}
case 12: {
Get();
while (t.kind == 1) {
NameDecl();
}
genNames = true;
break;
}
case 13: {
Get();
while (t.kind == 1 || t.kind == 2) {
TokenDecl(Tab.pr);
}
break;
}
case 14: {
Get();
Expect(15);
g1 = TokenExpr();
Expect(16);
g2 = TokenExpr();
if (t.kind == 17) {
Get();
nested = true;
}
new Comment(g1.l, g2.l, nested);
break;
}
case 18: {
Get();
if (t.kind == 19) {
Get();
ignoreCase = true;
} else if (StartOf(20)) {
Tab.ignored = Set();
Tab.ignored.set(32); /*' ' is always ignored*/
if (Tab.ignored.get(0)) SemError(19);
} else Error(56);
break;
}
default: Error(57);
}
}
private static void Coco() {
int sp, eofSy;
boolean undef, noAttrs, noRet, ok, ok1;
String gramName;
Symbol sym;
Graph g;
Expect(5);
eofSy = Tab.NewSym(Tab.t, "EOF", 0);
Tab.ignored = new BitSet();
Expect(1);
gramName = token.val;
Tab.semDeclPos = new Position();
Tab.semDeclPos.beg = t.pos;
while (StartOf(21)) {
Get();
}
Tab.semDeclPos.len = t.pos - Tab.semDeclPos.beg;
Tab.semDeclPos.col = 0;
while (StartOf(22)) {
Declaration();
}
while (!(t.kind == 0 || t.kind == 6)) {Error(58); Get();}
Expect(6);
ok = Successful();
if (ok && genScanner) ok = DFA.MakeDeterministic();
if (!ok) SemError(27);
Tab.nNodes = 0;
while (t.kind == 1) {
Get();
sp = Tab.FindSym(token.val);
undef = sp == Tab.noSym;
if (undef) {
sp = Tab.NewSym(Tab.nt, token.val, token.line);
sym = Tab.Sym(sp);
} else {
sym = Tab.Sym(sp);
if (sym.typ == Tab.nt) {
if (sym.struct > 0) SemError(7);
} else SemError(8);
sym.line = token.line;
}
noAttrs = sym.attrPos == null; sym.attrPos = null;
noRet = sym.retVar == null; sym.retVar = null;
if (t.kind == 27 || t.kind == 33) {
if (t.kind == 27) {
AttrDecl(sym);
} else {
AttrDecl1(sym);
}
}
if (!undef)
if (noAttrs && sym.attrPos != null
|| noRet && sym.retVar != null
|| !noAttrs && sym.attrPos == null
|| !noRet && sym.retVar == null) SemError(5);
if (t.kind == 41) {
sym.semPos = SemText();
}
ExpectWeak(7, 23);
g = Expression();
sym.struct = g.l;
Tab.CompleteGraph(g.r);
ExpectWeak(8, 24);
}
Expect(9);
Expect(1);
if (Tab.ddt[2]) Tab.PrintGraph();
Tab.gramSy = Tab.FindSym(gramName);
if (Tab.gramSy == Tab.noSym) SemError(11);
else {
sym = Tab.Sym(Tab.gramSy);
if (sym.attrPos != null) SemError(12);
}
if (!gramName.equals(token.val)) SemError(17);
if (Scanner.err.count == 0) {
System.out.println("Checking");
Tab.CompSymbolSets();
ok = Tab.NtsComplete();
if (ok) {
ok1 = Tab.AllNtReached();
ok = Tab.NoCircularProductions();
}
if (ok) ok = Tab.AllNtToTerm();
if (ok) ok1 = Tab.LL1();
if (Tab.ddt[0] && genScanner) DFA.PrintStates();
if (Tab.ddt[7]) Tab.XRef();
if (ok) {
ParserGen.WriteParser(genNames || Tab.ddt[4]);
System.out.print("Parser"); System.out.flush();
if (genScanner) {
System.out.print(" + Scanner");
System.out.flush();
DFA.WriteScanner(ignoreCase);
}
System.out.println(" generated");
if (Tab.ddt[8]) ParserGen.WriteStatistics();
}
else System.out.println("Errors in grammar");
}
if (Tab.ddt[6]) Tab.PrintSymbolTable();
System.out.println();
Expect(8);
}
static void Parse() {
t = new Token();
Get();
Coco();
}
private static boolean[][] set = {
{T,T,T,x, x,x,T,T, x,x,T,T, T,T,T,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,x,T, T,T,T,T, T,T,T,T, x},
{x,T,T,x, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,x,T, T,T,T,T, T,T,T,T, x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, x,T,T,T, T,T,T,T, T,T,T,T, x},
{x,T,T,x, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, x,T,T,T, T,T,T,T, T,T,T,T, x},
{x,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,T,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x, T,T,x,T, T,T,T,T, T,T,T,T, x},
{x,T,T,x, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x, T,T,x,T, T,T,T,T, T,T,T,T, x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x, x,T,T,T, T,T,T,T, T,T,T,T, x},
{x,T,T,x, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x, x,T,T,T, T,T,T,T, T,T,T,T, x},
{x,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, x,T,x,x, x,T,x,x, x,x,x,x, T,T,x,T, x,T,x,x, x},
{x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,x,T,x, x,x,x,T, x,x,T,x, x,x,x,x, x},
{x,x,x,x, x,x,T,x, T,x,T,T, T,T,T,x, T,T,T,x, x,x,x,x, x,x,T,x, x,x,T,x, x,x,x,x, x,x,T,x, x,x,x,x, x},
{T,T,T,x, x,x,T,T, x,x,T,T, T,T,T,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x},
{x,T,T,x, x,x,T,x, x,x,T,T, T,T,T,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x},
{x,T,T,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, x,T,T,x, x,T,T,x, x,x,x,T, T,T,T,T, x,T,x,x, x},
{x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,x,T,x, x,x,x,x, x,x,T,x, x,x,x,x, x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,x,T, x},
{x,T,T,x, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,x,x,T, x},
{x,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x},
{x,T,T,T, T,T,x,T, T,T,x,x, x,x,x,T, T,T,x,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, x},
{x,x,x,x, x,x,x,x, x,x,T,T, T,T,T,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x},
{T,T,T,x, x,x,T,T, T,x,T,T, T,T,T,x, x,x,T,x, x,x,x,T, x,T,x,x, x,T,x,x, x,x,x,T, T,T,x,T, x,T,x,x, x},
{T,T,T,x, x,x,T,T, x,T,T,T, T,T,T,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x}
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -