/// <summary> /// HTML Parser를 생성합니다. /// </summary> /// <returns></returns> private ShiftReduceParser get_pargen() { if (pargen != null) { return(pargen); } var gen = new ParserGenerator(); // Non-Terminals var html = gen.CreateNewProduction("HTML", false); var annote = gen.CreateNewProduction("ANNOTATE", false); // <!-- ~ --> var annote2 = gen.CreateNewProduction("ANNOTATE2", false); // <!~> var tag_closing = gen.CreateNewProduction("CLOSING", false); // <~> ~ </~> var tag_aio = gen.CreateNewProduction("ALLINONE", false); // <~/> // Terminals var open = gen.CreateNewProduction("open"); var empty_open = gen.CreateNewProduction("empty-open"); var close = gen.CreateNewProduction("close"); var empty_close = gen.CreateNewProduction("empty-close"); var annoate_open = gen.CreateNewProduction("annoate-open"); var annoate_close = gen.CreateNewProduction("annoate-close"); var annoate2_open = gen.CreateNewProduction("annoate2-open"); var tag_name = gen.CreateNewProduction("tag-name"); var attr_name = gen.CreateNewProduction("attr-name"); html |= annoate_open + annote + annoate_close; html |= annoate_open + annote2; html |= tag_closing; html |= tag_aio; html |= html + html; html |= ParserGenerator.EmptyString; try { gen.PushStarts(html); gen.PrintProductionRules(); gen.GenerateLALR(); gen.PrintStates(); gen.PrintTable(); } catch (Exception e) { Console.Console.Instance.WriteLine(e.Message); } Console.Console.Instance.WriteLine(gen.GlobalPrinter.ToString()); return(pargen = gen.CreateShiftReduceParserInstance()); }
/// <summary> /// ESRCAL의 파서제너레이터를 생성합니다. /// </summary> /// <returns></returns> private ShiftReduceParser get_pargen() { if (pargen != null) { return(pargen); } var gen = new ParserGenerator(); // Non-Terminals var expr = gen.CreateNewProduction("expr", false); // Terminals //var id = gen.CreateNewProduction("id"); var num = gen.CreateNewProduction("num"); //var str = gen.CreateNewProduction("str"); var plus = gen.CreateNewProduction("plus"); var minus = gen.CreateNewProduction("minus"); var multiple = gen.CreateNewProduction("multiple"); var divide = gen.CreateNewProduction("divide"); //var loop = gen.CreateNewProduction("loop"); var op_open = gen.CreateNewProduction("op_open"); var op_close = gen.CreateNewProduction("op_close"); //var pp_open = gen.CreateNewProduction("pp_open"); // [ //var pp_close = gen.CreateNewProduction("pp_close"); // ] //var equal = gen.CreateNewProduction("equal"); //var to = gen.CreateNewProduction("to"); //var scolon = gen.CreateNewProduction("scolon"); //var comma = gen.CreateNewProduction("comma"); //var _foreach = gen.CreateNewProduction("foreach"); //var _if = gen.CreateNewProduction("if"); //var _else = gen.CreateNewProduction("else"); expr |= num + ParserAction.Create(x => x.UserContents = double.Parse(x.Contents)); expr |= expr + plus + expr + ParserAction.Create(x => x.UserContents = (double)x.Childs[0].UserContents + (double)x.Childs[2].UserContents); expr |= expr + minus + expr + ParserAction.Create(x => x.UserContents = (double)x.Childs[0].UserContents - (double)x.Childs[2].UserContents); expr |= expr + multiple + expr + ParserAction.Create(x => x.UserContents = (double)x.Childs[0].UserContents * (double)x.Childs[2].UserContents); expr |= expr + divide + expr + ParserAction.Create(x => x.UserContents = (double)x.Childs[0].UserContents / (double)x.Childs[2].UserContents); expr |= minus + expr + ParserAction.Create(x => x.UserContents = -(double)x.Childs[1].UserContents); expr |= op_open + expr + op_close + ParserAction.Create(x => x.UserContents = x.Childs[1].UserContents); // right associativity, - gen.PushConflictSolver(false, new Tuple <ParserProduction, int>(expr, 5)); // left associativity, *, / gen.PushConflictSolver(true, multiple, divide); // left associativity, +, - gen.PushConflictSolver(true, plus, minus); try { gen.PushStarts(expr); gen.PrintProductionRules(); gen.GenerateLALR(); gen.PrintStates(); gen.PrintTable(); } catch (Exception e) { Console.Console.Instance.WriteLine(e.Message); } Console.Console.Instance.WriteLine(gen.GlobalPrinter.ToString()); return(pargen = gen.CreateShiftReduceParserInstance()); }
static void ProcessPGSample() { var gen = new ParserGenerator(); // Non-Terminals var E = gen.CreateNewProduction("E", false); //var T = gen.CreateNewProduction("T", false); //var F = gen.CreateNewProduction("F", false); //var func = gen.CreateNewProduction("func", false); //var arguments = gen.CreateNewProduction("args", false); // Terminals var plus = gen.CreateNewProduction("+"); // + var minus = gen.CreateNewProduction("-"); // - var multiple = gen.CreateNewProduction("*"); // * var divide = gen.CreateNewProduction("/"); // / //var id = gen.CreateNewProduction("id"); // [_$a-zA-Z][_$a-zA-Z0-9]* var op_open = gen.CreateNewProduction("("); // ( var op_close = gen.CreateNewProduction(")"); // ) var num = gen.CreateNewProduction("num"); // [0-9]+ //var split = gen.CreateNewProduction("split"); // , //exp |= exp + plus + term; //exp |= exp + minus + term; //exp |= term; //term |= term + multiple + factor; //term |= term + divide + factor; //term |= factor; //factor |= op_open + exp + op_close; //factor |= num; //factor |= id; //factor |= func; //func |= id + op_open + arguments + op_close; //arguments |= id; //arguments |= arguments + split + id; //arguments |= ParserGenerator.EmptyString; E |= E + plus + E + ParserAction.Create(x => { });; E |= E + minus + E + ParserAction.Create(x => { });; E |= E + multiple + E + ParserAction.Create(x => { });; E |= E + divide + E + ParserAction.Create(x => { });; E |= minus + E + ParserAction.Create(x => { });; E |= op_open + E + op_close + ParserAction.Create(x => { });; E |= num + ParserAction.Create(x => { });; gen.PushConflictSolver(false, new Tuple <ParserProduction, int>(E, 4)); gen.PushConflictSolver(true, multiple, divide); gen.PushConflictSolver(true, plus, minus); gen.PushStarts(E); gen.PrintProductionRules(); gen.GenerateLALR2(); gen.PrintStates(); gen.PrintTable(); Console.Instance.WriteLine(gen.GlobalPrinter.ToString()); Console.Instance.WriteLine(gen.CreateShiftReduceParserInstance().ToCSCode("Calculator")); ////////////////////////////////////////////////////// //var scanner_gen = new ScannerGenerator(); // //scanner_gen.PushRule("", @"[\r\n ]"); // Skip characters //scanner_gen.PushRule("+", @"\+"); //scanner_gen.PushRule("-", @"\-"); //scanner_gen.PushRule("*", @"\*"); //scanner_gen.PushRule("/", @"\/"); //scanner_gen.PushRule("(", @"\("); //scanner_gen.PushRule(")", @"\)"); //scanner_gen.PushRule("num", @"[0-9]+(\.[0-9]+)?([Ee][\+\-]?[0-9]+)?"); //scanner_gen.Generate(); //var ss = scanner_gen.CreateScannerInstance(); //var pp = gen.CreateShiftReduceParserInstance(); // //Action<string, string, int, int> insert = (string x, string y, int a, int b) => //{ // pp.Insert(x, y); // if (pp.Error()) throw new Exception($"[COMPILER] Parser error! L:{a}, C:{b}"); // while (pp.Reduce()) // { // var l = pp.LatestReduce(); // Console.Instance.Write(l.Production.PadLeft(8) + " => "); // Console.Instance.WriteLine(string.Join(" ", l.Childs.Select(z => z.Production))); // Console.Instance.Write(l.Production.PadLeft(8) + " => "); // Console.Instance.WriteLine(string.Join(" ", l.Childs.Select(z => z.Contents))); // pp.Insert(x, y); // if (pp.Error()) throw new Exception($"[COMPILER] Parser error! L:{a}, C:{b}"); // } //}; // //try //{ // int ll = 0; // var line = "5-(4+2*3-1)/(6+-5)"; // ss.AllocateTarget(line.Trim()); // // while (ss.Valid()) // { // var tk = ss.Next(); // if (ss.Error()) // throw new Exception("[COMPILER] Tokenize error! '" + tk + "'"); // insert(tk.Item1, tk.Item2, ll, tk.Item4); // } // // if (pp.Error()) throw new Exception(); // insert("$", "$", -1, -1); // // var tree = pp.Tree; // CALtoCS.PrintTree(tree.root, "", true); //} //catch (Exception e) //{ // Console.Instance.WriteLine(e.Message); //} }
/// <summary> /// SRCAL의 파서제너레이터를 생성합니다. /// </summary> /// <returns></returns> private ShiftReduceParser get_pargen() { if (pargen != null) { return(pargen); } var gen = new ParserGenerator(); // Non-Terminals var script = gen.CreateNewProduction("script", false); var line = gen.CreateNewProduction("line", false); var lines = gen.CreateNewProduction("lines", false); var expr = gen.CreateNewProduction("expr", false); var block = gen.CreateNewProduction("block", false); var iblock = gen.CreateNewProduction("iblock", false); var index = gen.CreateNewProduction("index", false); var variable = gen.CreateNewProduction("variable", false); var argument = gen.CreateNewProduction("argument", false); var function = gen.CreateNewProduction("function", false); var runnable = gen.CreateNewProduction("runnable", false); // Terminals var name = gen.CreateNewProduction("name"); var _const = gen.CreateNewProduction("const"); // number | string var loop = gen.CreateNewProduction("loop"); var op_open = gen.CreateNewProduction("op_open"); var op_close = gen.CreateNewProduction("op_close"); var pp_open = gen.CreateNewProduction("pp_open"); // [ var pp_close = gen.CreateNewProduction("pp_close"); // ] var equal = gen.CreateNewProduction("equal"); var to = gen.CreateNewProduction("to"); var scolon = gen.CreateNewProduction("scolon"); var comma = gen.CreateNewProduction("comma"); var _foreach = gen.CreateNewProduction("foreach"); var _if = gen.CreateNewProduction("if"); var _else = gen.CreateNewProduction("else"); script |= lines + ParserAction.Create(x => { }); script |= ParserGenerator.EmptyString + ParserAction.Create(x => { }); block |= pp_open + iblock + pp_close + ParserAction.Create(x => { }); block |= line + ParserAction.Create(x => { }); iblock |= block + ParserAction.Create(x => { }); iblock |= lines + ParserAction.Create(x => { }); iblock |= ParserGenerator.EmptyString + ParserAction.Create(x => { }); line |= expr + ParserAction.Create(x => { }); lines |= expr + ParserAction.Create(x => { }); lines |= expr + lines + ParserAction.Create(x => { }); expr |= function + ParserAction.Create(x => { }); expr |= name + equal + index + ParserAction.Create(x => { }); expr |= runnable + ParserAction.Create(x => { }); function |= name + op_open + op_close + ParserAction.Create(x => { }); function |= name + op_open + argument + op_close + ParserAction.Create(x => { }); argument |= index + ParserAction.Create(x => { }); argument |= index + comma + argument + ParserAction.Create(x => { }); index |= variable + ParserAction.Create(x => { }); index |= variable + pp_open + variable + pp_close + ParserAction.Create(x => { }); variable |= name + ParserAction.Create(x => { }); variable |= function + ParserAction.Create(x => { }); variable |= _const + ParserAction.Create(x => { }); runnable |= loop + op_open + name + equal + index + to + index + op_close + block + ParserAction.Create(x => { }); runnable |= _foreach + op_open + name + scolon + index + op_close + block + ParserAction.Create(x => { }); runnable |= _if + op_open + index + op_close + block + ParserAction.Create(x => { }); runnable |= _if + op_open + index + op_close + block + _else + block + ParserAction.Create(x => { }); gen.PushConflictSolver(true, _else); gen.PushConflictSolver(true, new Tuple <ParserProduction, int>(runnable, 2)); try { gen.PushStarts(script); gen.PrintProductionRules(); gen.GenerateLALR(); gen.PrintStates(); gen.PrintTable(); } catch (Exception e) { Console.Console.Instance.WriteLine(e.Message); } Console.Console.Instance.WriteLine(gen.GlobalPrinter.ToString()); return(pargen = gen.CreateShiftReduceParserInstance()); }