public Grammar Parse(string filename) { this.scanner = new Scanner(filename); this.grammar = new Grammar(); this.Advance(); this.ParseHeader(); this.ParseDeclarations(); this.ParseProductions(); this.ParseEpilog(); return this.grammar; }
public Grammar Parse(string filename) { scanner = new Scanner(filename); grammar = new Grammar(); baseName = System.IO.Path.GetFileNameWithoutExtension(filename); if (GPCG.DEFINES) grammar.TokFName = baseName + ".tokens"; Advance(); ParseHeader(); ParseDeclarations(); ParseProductions(); ParseEpilog(); return grammar; }
public void Generate(List<State> states, Grammar grammar) { this.grammar = grammar; this.GenerateCopyright(); this.GenerateUsingHeader(); this.output.WriteLine(grammar.headerCode); if (grammar.Namespace != null) { this.output.WriteLine("namespace {0}", grammar.Namespace); this.output.WriteLine("{"); } this.GenerateTokens(grammar.terminals); this.GenerateClassHeader(grammar.ParserName); this.InsertCode(grammar.prologCode); this.GenerateInitializeMethod(grammar.ParserName, states, grammar.productions, grammar.nonTerminals); this.GenerateActionMethod(grammar.productions); this.GenerateToStringMethod(); this.InsertCode(grammar.epilogCode); this.GenerateClassFooter(); if (grammar.Namespace != null) { this.output.WriteLine("}"); } }
public LR0Generator(Grammar grammar) { this.grammar = grammar; }
public void Generate(List<State> states, Grammar grammar) { StreamWriter tWrtr = null; StreamWriter sWrtr = null; StreamWriter cWrtr = null; TextWriter save = Console.Out; this.grammar = grammar; if (grammar.OutFName != null) { try { FileStream fStrm = new FileStream(grammar.OutFName, FileMode.Create); sWrtr = new StreamWriter(fStrm); Console.WriteLine("GPPG: sending output to {0}", grammar.OutFName); Console.SetOut(sWrtr); } catch (IOException x) { Console.Error.WriteLine("GPPG: Error. File redirect failed"); Console.Error.WriteLine(x.Message); Console.Error.WriteLine("GPPG: Terminating ..."); Environment.Exit(1); } } if (grammar.TokFName != null) // generate token list file { try { FileStream fStrm = new FileStream(grammar.TokFName, FileMode.Create); tWrtr = new StreamWriter(fStrm); tWrtr.WriteLine("// Symbolic tokens for parser for grammar file \"{0}\"", grammar.InputFName); } catch (IOException x) { Console.Error.WriteLine("GPPG: Error. Failed to create token namelist file"); Console.Error.WriteLine(x.Message); tWrtr = null; } } if (grammar.DiagFName != null) // generate conflict list file { try { FileStream cStrm = new FileStream(grammar.DiagFName, FileMode.Create); cWrtr = new StreamWriter(cStrm); cWrtr.WriteLine("// Parser Conflict Information for grammar file \"{0}\"", grammar.InputFName); cWrtr.WriteLine(); } catch (IOException x) { Console.Error.WriteLine("GPPG: Error. Failed to create conflict information file"); Console.Error.WriteLine(x.Message); cWrtr = null; } } GenerateCopyright(); GenerateUsingHeader(); if (grammar.Namespace != null) { Console.WriteLine("namespace {0}", grammar.Namespace); Console.WriteLine('{'); } GenerateTokens(grammar.terminals, tWrtr); grammar.ReportConflicts(cWrtr); GenerateClassHeader(grammar.ParserName); InsertCode(grammar.prologCode); GenerateInitializeMethod(states, grammar.productions, grammar.nonTerminals); GenerateActionMethod(grammar.productions); GenerateToStringMethod(); InsertCode(grammar.epilogCode); GenerateClassFooter(); if (grammar.Namespace != null) Console.WriteLine('}'); if (tWrtr != null) { tWrtr.WriteLine("// End symbolic tokens for parser"); tWrtr.Close(); // Close the optional token name stream } if (cWrtr != null) { cWrtr.WriteLine("// End conflict information for parser"); cWrtr.Close(); // Close the optional token name stream } if (sWrtr != null) { Console.SetOut(save); sWrtr.Close(); } }
public LALRGenerator(Grammar grammar) : base(grammar) { }
private void ParseRhs(NonTerminal lhs) { Production production = new Production(lhs); int num = 0; while (this.token == GrammarToken.Comment) { this.Advance(); } while (this.token == GrammarToken.Symbol || this.token == GrammarToken.Literal || this.token == GrammarToken.Action || this.token == GrammarToken.Prec) { GrammarToken grammarToken = this.token; switch (grammarToken) { case GrammarToken.Symbol: if (this.grammar.terminals.ContainsKey(this.scanner.yylval)) { production.rhs.Add(this.grammar.terminals[this.scanner.yylval]); } else { production.rhs.Add(this.grammar.LookupNonTerminal(this.scanner.yylval)); } this.Advance(); num++; break; case GrammarToken.Literal: production.rhs.Add(this.grammar.LookupTerminal(this.token, this.scanner.yylval)); this.Advance(); num++; break; case GrammarToken.Action: { SemanticAction semanticAction = new SemanticAction(production, this.tokenStartLine, num, this.scanner.yylval); this.Advance(); if (this.token == GrammarToken.Divider || this.token == GrammarToken.SemiColon || this.token == GrammarToken.Prec) { production.semanticAction = semanticAction; } else { Grammar arg_1BA_0 = this.grammar; string arg_1B5_0 = "@"; int num2 = ++this.grammar.NumActions; NonTerminal nonTerminal = arg_1BA_0.LookupNonTerminal(arg_1B5_0 + num2.ToString()); Production production2 = new Production(nonTerminal); production2.semanticAction = semanticAction; this.grammar.AddProduction(production2); production.rhs.Add(nonTerminal); } num++; break; } default: if (grammarToken == GrammarToken.Prec) { this.Advance(); if (this.token == GrammarToken.Symbol) { production.prec = this.grammar.LookupTerminal(this.token, this.scanner.yylval).prec; this.Advance(); } else { this.scanner.ReportError("Expected symbol after %prec", new object[0]); } } break; } while (this.token == GrammarToken.Comment) { this.Advance(); } } this.grammar.AddProduction(production); Precedence.Calculate(production); }
private void ParseDeclarations() { int num = 0; while (this.token != GrammarToken.EndOfSection && this.token != GrammarToken.Eof) { switch (this.token) { case GrammarToken.Union: this.grammar.unionType = this.scanner.yylval; this.Advance(); continue; case GrammarToken.Type: { this.Advance(); string kind = null; if (this.token == GrammarToken.Kind) { kind = this.scanner.yylval; this.Advance(); } while (this.token == GrammarToken.Symbol) { NonTerminal nonTerminal = this.grammar.LookupNonTerminal(this.scanner.yylval); nonTerminal.kind = kind; this.Advance(); } continue; } case GrammarToken.Token: { this.Advance(); string kind2 = null; if (this.token == GrammarToken.Kind) { kind2 = this.scanner.yylval; this.Advance(); } while (this.token == GrammarToken.Symbol) { string name = this.scanner.yylval; Terminal terminal = this.grammar.LookupTerminal(this.token, name); terminal.kind = kind2; this.Advance(); if (this.token == GrammarToken.Number) { int value = 0; if (!int.TryParse(this.scanner.yylval, out value)) { this.scanner.ReportError("Incorrect token {0} value {1}", new object[] { this.token, this.scanner.yylval }); } this.grammar.AssignTerminalValue(name, value); this.Advance(); } if (this.token == GrammarToken.Comment) { this.grammar.AssignTerminalComment(name, this.scanner.yylval.TrimStart('/')); this.Advance(); } } continue; } case GrammarToken.Left: this.Advance(); num += 10; while (this.token == GrammarToken.Symbol || this.token == GrammarToken.Literal) { Terminal terminal2 = this.grammar.LookupTerminal(this.token, this.scanner.yylval); terminal2.prec = new Precedence(PrecType.left, num); this.Advance(); } continue; case GrammarToken.Right: this.Advance(); num += 10; while (this.token == GrammarToken.Symbol || this.token == GrammarToken.Literal) { Terminal terminal3 = this.grammar.LookupTerminal(this.token, this.scanner.yylval); terminal3.prec = new Precedence(PrecType.right, num); this.Advance(); } continue; case GrammarToken.NonAssoc: this.Advance(); num += 10; while (this.token == GrammarToken.Symbol || this.token == GrammarToken.Literal) { Terminal terminal4 = this.grammar.LookupTerminal(this.token, this.scanner.yylval); terminal4.prec = new Precedence(PrecType.nonassoc, num); this.Advance(); } continue; case GrammarToken.Prolog: { Grammar expr_7B = this.grammar; expr_7B.prologCode += this.scanner.yylval; this.Advance(); continue; } case GrammarToken.Start: this.Advance(); if (this.token == GrammarToken.Symbol) { this.grammar.startSymbol = this.grammar.LookupNonTerminal(this.scanner.yylval); this.Advance(); continue; } continue; case GrammarToken.Namespace: this.Advance(); this.grammar.Namespace = this.scanner.yylval; this.Advance(); while (this.scanner.yylval == ".") { this.Advance(); Grammar expr_2FF = this.grammar; expr_2FF.Namespace = expr_2FF.Namespace + "." + this.scanner.yylval; this.Advance(); } continue; case GrammarToken.Visibility: this.Advance(); this.grammar.Visibility = this.scanner.yylval; this.Advance(); continue; case GrammarToken.Attributes: { this.Advance(); StringBuilder stringBuilder = new StringBuilder(this.scanner.yylval); while (this.Advance() == GrammarToken.Symbol) { stringBuilder.Append(' '); stringBuilder.Append(this.scanner.yylval); } this.grammar.Attributes = stringBuilder.ToString(); continue; } case GrammarToken.ValueTypeAttributes: { this.Advance(); StringBuilder stringBuilder = new StringBuilder(this.scanner.yylval); while (this.Advance() == GrammarToken.Symbol) { stringBuilder.Append(' '); stringBuilder.Append(this.scanner.yylval); } this.grammar.ValueTypeAttributes = stringBuilder.ToString(); continue; } case GrammarToken.ParserName: this.Advance(); this.grammar.ParserName = this.scanner.yylval; this.Advance(); continue; case GrammarToken.TokenName: this.Advance(); this.grammar.TokenName = this.scanner.yylval; this.Advance(); continue; case GrammarToken.ValueTypeName: this.Advance(); this.grammar.ValueTypeName = this.scanner.yylval; this.Advance(); continue; case GrammarToken.PositionType: this.Advance(); this.grammar.PositionType = this.scanner.yylval; this.Advance(); continue; case GrammarToken.Comment: this.Advance(); continue; } this.scanner.ReportError("Unexpected token {0} in declaration section", new object[] { this.token }); this.Advance(); } this.Advance(); }
public void Generate(List <State> states, Grammar grammar) { StreamWriter tWrtr = null; StreamWriter sWrtr = null; TextWriter save = Console.Out; this.grammar = grammar; if (grammar.OutFName != null) { try { FileStream fStrm = new FileStream(grammar.OutFName, FileMode.Create); sWrtr = new StreamWriter(fStrm); Console.WriteLine("GPPG: sending output to {0}", grammar.OutFName); Console.SetOut(sWrtr); } catch (IOException x) { Console.Error.WriteLine("GPPG: Error. File redirect failed"); Console.Error.WriteLine(x.Message); Console.Error.WriteLine("GPPG: Terminating ..."); Environment.Exit(1); } } if (grammar.TokFName != null) // generate token list file { try { FileStream fStrm = new FileStream(grammar.TokFName, FileMode.Create); tWrtr = new StreamWriter(fStrm); tWrtr.WriteLine("// Symbolic tokens for parser"); } catch (IOException x) { Console.Error.WriteLine("GPPG: Error. Failed to create token namelist file"); Console.Error.WriteLine(x.Message); tWrtr = null; } } InsertCode(grammar.header); if (grammar.Namespace != null) { Console.WriteLine("namespace {0}", grammar.Namespace); Console.WriteLine("{"); } GenerateTokens(grammar.terminals, tWrtr); GenerateClassHeader(grammar.ParserName); InsertCode(grammar.prologCode); GenerateInitializeMethod(states, grammar.productions); GenerateInitializeMetadata(grammar.productions, grammar.nonTerminals); GenerateActionMethod(grammar.productions); InsertCode(grammar.epilogCode); GenerateClassFooter(); if (grammar.Namespace != null) { Console.WriteLine("}"); } if (tWrtr != null) { tWrtr.WriteLine("// End symbolic tokens for parser"); tWrtr.Close(); // Close the optional token name stream } if (sWrtr != null) { Console.SetOut(save); sWrtr.Close(); } }