⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 cocorj09-一个Java语言分析器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		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 + -