static void TokenTerm(out Graph g) { Graph g2; TokenFactor(out g); while (StartOf(16)) { TokenFactor(out g2); Graph.MakeSequence(g, g2); } if (la.kind == 37) { Get(); Expect(28); TokenExpr(out g2); Graph.SetContextTrans(g2.l); Graph.MakeSequence(g, g2); Expect(29); } }
void Term(out Graph g) { Graph g2; Node rslv = null; g = null; if (StartOf(19)) { if (la.kind == 44 || la.kind == 45) { if (la.kind == 44) { rslv = tab.NewNode(Node.rslv, null, la.line, la.col); Resolver(out rslv.pos); g = new Graph(rslv); } else { rslv = tab.NewNode(Node.expectedConflict, null, la.line, la.col); ExpectedConflict(out rslv.pos, out rslv.conflictSymbols); g = new Graph(rslv); } } Factor(out g2); if (rslv != null) tab.MakeSequence(g, g2); else g = g2; while (StartOf(20)) { Factor(out g2); tab.MakeSequence(g, g2); } } else if (StartOf(21)) { g = new Graph(tab.NewNode(Node.eps)); } else SynErr(58); if (g == null) // invalid start of Term g = new Graph(tab.NewNode(Node.eps)); }
void TokenFactor(out Graph g) { string name; int kind; g = null; if (la.kind == 1 || la.kind == 3 || la.kind == 5) { Sym(out name, out kind); if (kind == isIdent) { CharClass c = tab.FindCharClass(name); if (c == null) { SemErr("undefined name"); c = tab.NewCharClass(name, new CharSet()); } Node p = tab.NewNode(Node.clas); p.val = c.n; g = new Graph(p); tokenString = noString; } else { // str g = tab.StrToGraph(name); if (tokenString == null) tokenString = name; else tokenString = noString; } } else if (la.kind == 37) { Get(); TokenExpr(out g); Expect(38); } else if (la.kind == 39) { Get(); TokenExpr(out g); Expect(40); tab.MakeOption(g, t.line, 0); tokenString = noString; } else if (la.kind == 41) { Get(); TokenExpr(out g); Expect(42); tab.MakeIteration(g, t.line, 0); tokenString = noString; } else SynErr(61); if (g == null) // invalid start of TokenFactor g = new Graph(tab.NewNode(Node.eps)); }
public void Finish(Graph g) { Node p = g.r; while (p != null) { Node q = p.next; p.next = null; p = q; } }
void Expression(out Graph g) { Graph g2; Term(out g); bool first = true; while (WeakSeparator(34,17,18) ) { Term(out g2); if (first) { tab.MakeFirstAlt(g); first = false; } tab.MakeAlternative(g, g2); } }
// The result will be in g1 public void MakeAlternative(Graph g1, Graph g2) { g2.l = NewNode(Node.alt, g2.l); g2.l.line = g2.l.sub.line; g2.l.up = true; g2.r.up = true; Node p = g1.l; while (p.down != null) p = p.down; p.down = g2.l; p = g1.r; while (p.next != null) p = p.next; // append alternative to g1 end list p.next = g2.l; // append g2 end list to g1 end list g2.l.next = g2.r; }
public void MakeIteration(Graph g) { g.l = NewNode(Node.iter, g.l); g.r.up = true; Node p = g.r; g.r = g.l; while (p != null) { Node q = p.next; p.next = g.l; p = q; } }
public void MakeIteration(Graph g, int line, int col) { g.l = NewNode(Node.iter, g.l); g.l.line = line; g.l.col = col; g.r.up = true; Node p = g.r; g.r = g.l; while (p != null) { Node q = p.next; p.next = g.l; p = q; } }
public void MakeOption(Graph g, int line, int col) { g.l = NewNode(Node.opt, g.l); g.l.line = line; g.l.col = col; g.r.up = true; g.l.next = g.r; g.r = g.l; }
public static void MakeOption(Graph g) { g.l = new Node(Node.opt, g.l); g.l.next = g.r; g.r = g.l; }
public static Graph StrToGraph(string str) { string s = DFA.Unescape(str.Substring(1, str.Length-2)); if (s.IndexOf('\0') >= 0) Parser.SemErr("\\0 not allowed here. Used as eof character"); if (s.Length == 0) Parser.SemErr("empty token not allowed"); Graph g = new Graph(); g.r = dummyNode; for (int i = 0; i < s.Length; i++) { Node p = new Node(Node.chr, (int)s[i], 0); g.r.next = p; g.r = p; } g.l = dummyNode.next; dummyNode.next = null; return g; }
public static void MakeAlternative(Graph g1, Graph g2) { g2.l = new Node(Node.alt, g2.l); g2.l.line = g2.l.sub.line; Node p = g1.l; while (p.down != null) p = p.down; p.down = g2.l; p = g1.r; while (p.next != null) p = p.next; p.next = g2.r; }
public static void MakeFirstAlt(Graph g) { g.l = new Node(Node.alt, g.l); g.l.line = g.l.sub.line; /* AW 2002-03-07 make line available for error handling */ g.l.next = g.r; g.r = g.l; }
static void TokenFactor(out Graph g) { string name; int kind; g = new Graph(); if (la.kind == 1 || la.kind == 3 || la.kind == 5) { Sym(out name, out kind); if (kind == id) { CharClass c = CharClass.Find(name); if (c == null) { SemErr("undefined name"); c = new CharClass(name, new BitArray(CharClass.charSetSize)); } Node p = new Node(Node.clas, null, 0); p.val = c.n; g = new Graph(p); } else g = Graph.StrToGraph(name); // str } else if (la.kind == 28) { Get(); TokenExpr(out g); Expect(29); } else if (la.kind == 30) { Get(); TokenExpr(out g); Expect(31); Graph.MakeOption(g); } else if (la.kind == 32) { Get(); TokenExpr(out g); Expect(33); Graph.MakeIteration(g); } else SynErr(54); }
void Factor( #line 341 "Coco.atg" //SOURCE beg=14902,len=11,col=8 out Graph g #line default //END SOURCE ) { #line 341 "Coco.atg" //SOURCE beg=14930,len=137,col=36 string name; int kind; Position pos; bool weak = false; g = null; #line default //END SOURCE switch (la.kind) { case _ident: case _string: case _char: case 30: { if (la.kind == 30) { Get(); #line 345 "Coco.atg" //SOURCE beg=15109,len=13,col=36 weak = true; #line default //END SOURCE } Sym( #line 347 "Coco.atg" //SOURCE beg=15137,len=18,col=7 out name, out kind #line default //END SOURCE ); #line 347 "Coco.atg" //SOURCE beg=15166,len=1542,col=36 Symbol sym = tab.FindSym(name); if (sym == null && kind == str) sym = tab.literals[name] as Symbol; bool undef = sym == null; if (undef) { if (kind == id) sym = tab.NewSym(Node.nt, name, 0); // forward nt else if (genScanner) { sym = tab.NewSym(Node.t, name, t.line); dfa.MatchLiteral(sym.name, sym); } else { // undefined string in production SemErr("undefined string in production"); sym = tab.eofSy; // dummy } } int typ = sym.typ; if (typ != Node.t && typ != Node.nt) SemErr("this symbol kind is not allowed in a production"); if (weak) if (typ == Node.t) typ = Node.wt; else SemErr("only terminals may be weak"); Node p = tab.NewNode(typ, sym, t.line); g = new Graph(p); #line default //END SOURCE if (la.kind == 25 || la.kind == 27) { Attribs( #line 371 "Coco.atg" //SOURCE beg=16724,len=1,col=13 p #line default //END SOURCE ); #line 371 "Coco.atg" //SOURCE beg=16747,len=62,col=36 if (kind != id) SemErr("a literal must not have attributes"); #line default //END SOURCE } #line 372 "Coco.atg" //SOURCE beg=16848,len=312,col=36 if (undef) sym.attrPos = p.pos; // dummy else if ((p.pos == null) != (sym.attrPos == null)) SemErr("attribute mismatch between declaration and use of this symbol"); #line default //END SOURCE break; } case 31: { Get(); Expression( #line 377 "Coco.atg" //SOURCE beg=17181,len=5,col=18 out g #line default //END SOURCE ); Expect(32); break; } case 33: { Get(); Expression( #line 378 "Coco.atg" //SOURCE beg=17210,len=5,col=18 out g #line default //END SOURCE ); Expect(34); #line 378 "Coco.atg" //SOURCE beg=17228,len=19,col=36 tab.MakeOption(g); #line default //END SOURCE break; } case 35: { Get(); Expression( #line 379 "Coco.atg" //SOURCE beg=17268,len=5,col=18 out g #line default //END SOURCE ); Expect(36); #line 379 "Coco.atg" //SOURCE beg=17286,len=22,col=36 tab.MakeIteration(g); #line default //END SOURCE break; } case 40: { SemText( #line 380 "Coco.atg" //SOURCE beg=17322,len=7,col=11 out pos #line default //END SOURCE ); #line 380 "Coco.atg" //SOURCE beg=17347,len=178,col=36 Node p = tab.NewNode(Node.sem, null, 0); p.pos = pos; g = new Graph(p); #line default //END SOURCE break; } case 24: { Get(); #line 384 "Coco.atg" //SOURCE beg=17564,len=163,col=36 Node p = tab.NewNode(Node.any, null, 0); // p.set is set in tab.SetupAnys g = new Graph(p); #line default //END SOURCE break; } case 37: { Get(); #line 387 "Coco.atg" //SOURCE beg=17766,len=130,col=36 Node p = tab.NewNode(Node.sync, null, 0); g = new Graph(p); #line default //END SOURCE break; } default: SynErr(52); break; } #line 390 "Coco.atg" //SOURCE beg=17935,len=161,col=36 if (g == null) // invalid start of Factor g = new Graph(tab.NewNode(Node.eps, null, 0)); #line default //END SOURCE }
void Term(out Graph g) { Graph g2; Node rslv = null; g = null; if (StartOf(17)) { if (la.kind == 37) { rslv = tab.NewNode(Node.rslv, null, la.line); Resolver(out rslv.pos); g = new Graph(rslv); } Factor(out g2); if (rslv != null) tab.MakeSequence(g, g2); else g = g2; while (StartOf(18)) { Factor(out g2); tab.MakeSequence(g, g2); } } else if (StartOf(19)) { g = new Graph(tab.NewNode(Node.eps, null, 0)); } else SynErr(48); if (g == null) // invalid start of Term g = new Graph(tab.NewNode(Node.eps, null, 0)); }
public void MakeFirstAlt(Graph g) { g.l = NewNode(Node.alt, g.l); g.l.line = g.l.sub.line; g.r.up = true; g.l.next = g.r; g.r = g.l; }
void Factor(out Graph g) { string name; int kind; Position pos; bool weak = false; g = null; switch (la.kind) { case 1: case 3: case 5: case 29: { if (la.kind == 29) { Get(); weak = true; } Sym(out name, out kind); Symbol sym = tab.FindSym(name); if (sym == null && kind == str) sym = tab.literals[name] as Symbol; bool undef = sym == null; if (undef) { if (kind == id) sym = tab.NewSym(Node.nt, name, 0); // forward nt else if (genScanner) { sym = tab.NewSym(Node.t, name, t.line); dfa.MatchLiteral(sym.name, sym); } else { // undefined string in production SemErr("undefined string in production"); sym = tab.eofSy; // dummy } } int typ = sym.typ; if (typ != Node.t && typ != Node.nt) SemErr("this symbol kind is not allowed in a production"); if (weak) if (typ == Node.t) typ = Node.wt; else SemErr("only terminals may be weak"); Node p = tab.NewNode(typ, sym, t.line); g = new Graph(p); if (la.kind == 24 || la.kind == 26) { Attribs(p); if (kind != id) SemErr("a literal must not have attributes"); } if (undef) sym.attrPos = p.pos; // dummy else if ((p.pos == null) != (sym.attrPos == null)) SemErr("attribute mismatch between declaration and use of this symbol"); break; } case 30: { Get(); Expression(out g); Expect(31); break; } case 32: { Get(); Expression(out g); Expect(33); tab.MakeOption(g); break; } case 34: { Get(); Expression(out g); Expect(35); tab.MakeIteration(g); break; } case 39: { SemText(out pos); Node p = tab.NewNode(Node.sem, null, 0); p.pos = pos; g = new Graph(p); break; } case 23: { Get(); Node p = tab.NewNode(Node.any, null, 0); // p.set is set in tab.SetupAnys g = new Graph(p); break; } case 36: { Get(); Node p = tab.NewNode(Node.sync, null, 0); g = new Graph(p); break; } default: SynErr(49); break; } if (g == null) // invalid start of Factor g = new Graph(tab.NewNode(Node.eps, null, 0)); }
// The result will be in g1 public void MakeSequence(Graph g1, Graph g2) { Node p = g1.r.next; g1.r.next = g2.l; // link head node while (p != null) { // link substructure Node q = p.next; p.next = g2.l; p = q; } g1.r = g2.r; }
void TokenTerm( #line 422 "Coco.atg" //SOURCE beg=19117,len=11,col=11 out Graph g #line default //END SOURCE ) { #line 422 "Coco.atg" //SOURCE beg=19142,len=10,col=36 Graph g2; #line default //END SOURCE TokenFactor( #line 424 "Coco.atg" //SOURCE beg=19173,len=5,col=15 out g #line default //END SOURCE ); while (StartOf(7)) { TokenFactor( #line 425 "Coco.atg" //SOURCE beg=19197,len=6,col=17 out g2 #line default //END SOURCE ); #line 425 "Coco.atg" //SOURCE beg=19216,len=25,col=36 tab.MakeSequence(g, g2); #line default //END SOURCE } if (la.kind == 39) { Get(); Expect(31); TokenExpr( #line 428 "Coco.atg" //SOURCE beg=19283,len=6,col=19 out g2 #line default //END SOURCE ); #line 428 "Coco.atg" //SOURCE beg=19300,len=112,col=36 tab.SetContextTrans(g2.l); dfa.hasCtxMoves = true; tab.MakeSequence(g, g2); #line default //END SOURCE Expect(32); } }
public void MakeOption(Graph g) { g.l = NewNode(Node.opt, g.l); g.r.up = true; g.l.next = g.r; g.r = g.l; }
void TokenFactor( #line 436 "Coco.atg" //SOURCE beg=19539,len=11,col=13 out Graph g #line default //END SOURCE ) { #line 436 "Coco.atg" //SOURCE beg=19562,len=23,col=36 string name; int kind; #line default //END SOURCE #line 438 "Coco.atg" //SOURCE beg=19627,len=10,col=36 g = null; #line default //END SOURCE if (la.kind == _ident || la.kind == _string || la.kind == _char) { Sym( #line 439 "Coco.atg" //SOURCE beg=19647,len=18,col=7 out name, out kind #line default //END SOURCE ); #line 439 "Coco.atg" //SOURCE beg=19676,len=888,col=36 if (kind == id) { CharClass c = tab.FindCharClass(name); if (c == null) { SemErr("undefined name"); c = tab.NewCharClass(name, new CharSet()); } Node p = tab.NewNode(Node.clas, null, 0); p.val = c.n; g = new Graph(p); tokenString = noString; } else { // str g = tab.StrToGraph(name); if (tokenString == null) tokenString = name; else tokenString = noString; } #line default //END SOURCE } else if (la.kind == 31) { Get(); TokenExpr( #line 454 "Coco.atg" //SOURCE beg=20584,len=5,col=17 out g #line default //END SOURCE ); Expect(32); } else if (la.kind == 33) { Get(); TokenExpr( #line 455 "Coco.atg" //SOURCE beg=20612,len=5,col=17 out g #line default //END SOURCE ); Expect(34); #line 455 "Coco.atg" //SOURCE beg=20631,len=19,col=36 tab.MakeOption(g); #line default //END SOURCE } else if (la.kind == 35) { Get(); TokenExpr( #line 456 "Coco.atg" //SOURCE beg=20670,len=5,col=17 out g #line default //END SOURCE ); Expect(36); #line 456 "Coco.atg" //SOURCE beg=20689,len=22,col=36 tab.MakeIteration(g); #line default //END SOURCE } else SynErr(54); #line 457 "Coco.atg" //SOURCE beg=20750,len=132,col=36 if (g == null) // invalid start of TokenFactor g = new Graph(tab.NewNode(Node.eps, null, 0)); #line default //END SOURCE }
public Graph StrToGraph(string str) { string s = Unescape(str.Substring(1, str.Length-2)); if (s.Length == 0) parser.SemErr("empty token not allowed"); Graph g = new Graph(); g.r = dummyNode; for (int i = 0; i < s.Length; i++) { Node p = NewNode(Node.chr, (int)s[i], 0); g.r.next = p; g.r = p; } g.l = dummyNode.next; dummyNode.next = null; return g; }
void TokenExpr( #line 409 "Coco.atg" //SOURCE beg=18670,len=11,col=11 out Graph g #line default //END SOURCE ) { #line 409 "Coco.atg" //SOURCE beg=18695,len=10,col=36 Graph g2; #line default //END SOURCE TokenTerm( #line 411 "Coco.atg" //SOURCE beg=18724,len=5,col=13 out g #line default //END SOURCE ); #line 411 "Coco.atg" //SOURCE beg=18747,len=19,col=36 bool first = true; #line default //END SOURCE while (WeakSeparator(29,7,8) ) { TokenTerm( #line 414 "Coco.atg" //SOURCE beg=18831,len=6,col=15 out g2 #line default //END SOURCE ); #line 414 "Coco.atg" //SOURCE beg=18852,len=149,col=36 if (first) { tab.MakeFirstAlt(g); first = false; } tab.MakeAlternative(g, g2); #line default //END SOURCE } }
void Factor(out Graph g) { string name; int kind; Position pos; bool weak = false; bool greedy = false; g = null; switch (la.kind) { case 1: case 3: case 5: case 35: case 36: { if (la.kind == 35) { Get(); weak = true; } if (la.kind == 36) { Get(); greedy = true; } Sym(out name, out kind); Symbol sym = tab.FindSym(name); if (sym == null && kind == isLiteral) sym = tab.literals[name] as Symbol; bool undef = (sym == null); if (undef) { sym = ForwardDeclare(name, kind); } int typ = sym.typ; if (typ != Node.t && typ != Node.nt) SemErr("this symbol kind is not allowed in a production"); if (weak) if (typ == Node.t) typ = Node.wt; else SemErr("only terminals may be weak"); if (greedy && typ != Node.nt) SemErr("only nonterminals may be greedy"); Node p = tab.NewNode(typ, sym, t.line, t.col); p.greedy = greedy; g = new Graph(p); if (la.kind == 30 || la.kind == 32) { Attribs(p); } if (undef) sym.attrPos = p.pos; // dummy else if (kind != isLiteral && (p.pos == null) != (sym.attrPos == null || sym.isAuto)) SemErr("attribute mismatch between declaration and use of this symbol"); break; } case 37: { Get(); Expression(out g); Expect(38); break; } case 39: { Get(); int line = t.line; int col = t.col; Expression(out g); tab.MakeOption(g, line, col); Expect(40); break; } case 41: { Get(); int line = t.line; int col = t.col; Expression(out g); tab.MakeIteration(g, line, col); Expect(42); break; } case 48: { SemText(out pos); Node p = tab.NewNode(Node.sem); p.pos = pos; g = new Graph(p); break; } case 28: { Get(); Node p = tab.NewNode(Node.any, null, t.line, t.col); // p.set is set in tab.SetupAnys g = new Graph(p); break; } case 43: { Get(); Node p = tab.NewNode(Node.sync, null, t.line, t.col); g = new Graph(p); break; } default: SynErr(59); break; } if (g == null) // invalid start of Factor g = new Graph(tab.NewNode(Node.eps)); }
void Expression( #line 310 "Coco.atg" //SOURCE beg=13613,len=11,col=12 out Graph g #line default //END SOURCE ) { #line 310 "Coco.atg" //SOURCE beg=13637,len=10,col=36 Graph g2; #line default //END SOURCE Term( #line 312 "Coco.atg" //SOURCE beg=13662,len=5,col=8 out g #line default //END SOURCE ); #line 312 "Coco.atg" //SOURCE beg=13690,len=19,col=36 bool first = true; #line default //END SOURCE while (WeakSeparator(29,15,16) ) { Term( #line 315 "Coco.atg" //SOURCE beg=13769,len=6,col=10 out g2 #line default //END SOURCE ); #line 315 "Coco.atg" //SOURCE beg=13795,len=149,col=36 if (first) { tab.MakeFirstAlt(g); first = false; } tab.MakeAlternative(g, g2); #line default //END SOURCE } }
void TokenExpr(out Graph g) { Graph g2; TokenTerm(out g); bool first = true; while (WeakSeparator(34,9,10) ) { TokenTerm(out g2); if (first) { tab.MakeFirstAlt(g); first = false; } tab.MakeAlternative(g, g2); } }
void Term( #line 323 "Coco.atg" //SOURCE beg=14055,len=11,col=6 out Graph g #line default //END SOURCE ) { #line 323 "Coco.atg" //SOURCE beg=14085,len=38,col=36 Graph g2; Node rslv = null; g = null; #line default //END SOURCE if (StartOf(17)) { if (la.kind == 38) { #line 325 "Coco.atg" //SOURCE beg=14165,len=46,col=36 rslv = tab.NewNode(Node.rslv, null, la.line); #line default //END SOURCE Resolver( #line 326 "Coco.atg" //SOURCE beg=14228,len=12,col=14 out rslv.pos #line default //END SOURCE ); #line 326 "Coco.atg" //SOURCE beg=14250,len=21,col=36 g = new Graph(rslv); #line default //END SOURCE } Factor( #line 328 "Coco.atg" //SOURCE beg=14289,len=6,col=10 out g2 #line default //END SOURCE ); #line 328 "Coco.atg" //SOURCE beg=14315,len=126,col=36 if (rslv != null) tab.MakeSequence(g, g2); else g = g2; #line default //END SOURCE while (StartOf(18)) { Factor( #line 331 "Coco.atg" //SOURCE beg=14456,len=6,col=12 out g2 #line default //END SOURCE ); #line 331 "Coco.atg" //SOURCE beg=14480,len=25,col=36 tab.MakeSequence(g, g2); #line default //END SOURCE } } else if (StartOf(19)) { #line 333 "Coco.atg" //SOURCE beg=14549,len=47,col=36 g = new Graph(tab.NewNode(Node.eps, null, 0)); #line default //END SOURCE } else SynErr(51); #line 334 "Coco.atg" //SOURCE beg=14635,len=159,col=36 if (g == null) // invalid start of Term g = new Graph(tab.NewNode(Node.eps, null, 0)); #line default //END SOURCE }
void TokenTerm(out Graph g) { Graph g2; TokenFactor(out g); while (StartOf(9)) { TokenFactor(out g2); tab.MakeSequence(g, g2); } if (la.kind == 47) { Get(); Expect(37); TokenExpr(out g2); tab.SetContextTrans(g2.l); dfa.hasCtxMoves = true; tab.MakeSequence(g, g2); Expect(38); } }
static void Factor(out Graph g) { string name; int kind; Position pos; bool weak = false; g = null; switch (la.kind) { case 1: case 3: case 5: case 27: { if (la.kind == 27) { Get(); weak = true; } Sym(out name, out kind); Symbol sym = Symbol.Find(name); bool undef = sym == null; if (undef) { if (kind == id) sym = new Symbol(Node.nt, name, 0); // forward nt else if (genScanner) { sym = new Symbol(Node.t, name, t.line); DFA.MatchLiteral(sym); } else { // undefined string in production SemErr("undefined string in production"); sym = Tab.eofSy; // dummy } } int typ = sym.typ; if (typ != Node.t && typ != Node.nt && typ != Node.rslv) /* ML */ SemErr("this symbol kind is not allowed in a production"); if (weak) if (typ == Node.t) typ = Node.wt; else SemErr("only terminals may be weak"); Node p = new Node(typ, sym, t.line); g = new Graph(p); if (la.kind == 24) { Attribs(p); if (kind != id) SemErr("a literal must not have attributes"); } if (undef) sym.attrPos = p.pos; // dummy else if ((p.pos == null) != (sym.attrPos == null)) SemErr("attribute mismatch between declaration and use of this symbol"); break; } case 28: { Get(); Expression(out g); Expect(29); break; } case 30: { Get(); Expression(out g); Expect(31); Graph.MakeOption(g); break; } case 32: { Get(); Expression(out g); Expect(33); Graph.MakeIteration(g); break; } case 38: { SemText(out pos); Node p = new Node(Node.sem, null, 0); p.pos = pos; g = new Graph(p); break; } case 23: { Get(); Node p = new Node(Node.any, null, 0); // p.set is set in Tab.SetupAnys g = new Graph(p); break; } case 34: { Get(); Node p = new Node(Node.sync, null, 0); g = new Graph(p); break; } default: SynErr(53); break; } }