def ruleGrammar(): ''' function to generate a grammar for parsing grammar rules ''' LexD = kjParser.LexDictionary() # use SQL/Ansi style comments LexD.comment( COMMENTFORM ) # declare keywords RStart = LexD.keyword( RSKEY ) TwoColons = LexD.keyword( COLKEY ) LeadsTo = LexD.keyword( LTKEY ) # declare terminals ident = LexD.terminal(IDNAME, IDFORM, IdentFun ) # declare nonterminals Root = kjParser.nonterminal("Root") Rulelist = kjParser.nonterminal("RuleList") Rule = kjParser.nonterminal("Rule") RuleName = kjParser.nonterminal("RuleName") NonTerm = kjParser.nonterminal("NonTerm") Body = kjParser.nonterminal("Body") # declare rules # Root >> NonTerm :: Rulelist InitRule = kjParser.ParseRule( Root, \ [NonTerm, TwoColons, Rulelist], RootReduction ) # Rulelist >> RLNull = kjParser.ParseRule( Rulelist, [], NullRuleList) # Rulelist >> Rule Rulelist RLFull = kjParser.ParseRule( Rulelist, [Rule,Rulelist], FullRuleList) # Rule >> "@R :: NonTerm >> Body RuleR = kjParser.ParseRule( Rule, \ [RStart, RuleName, TwoColons, NonTerm, LeadsTo, Body],\ InterpRule) # Rulename >> ident RuleNameR = kjParser.ParseRule( RuleName, [ident], InterpRuleName) # NonTerm >> ident NonTermR = kjParser.ParseRule( NonTerm, [ident], InterpNonTerm) # Body >> BodyNull = kjParser.ParseRule( Body, [], NullBody) # Body >> ident Body BodyFull = kjParser.ParseRule( Body, [ident,Body], FullBody) # declare Rules list and Associated Name dictionary Rules = [RLNull, RLFull, RuleR, RuleNameR, NonTermR,\ BodyNull, BodyFull, InitRule] RuleDict = \ { "RLNull":0, "RLFull":1, "RuleR":2, "RuleNameR":3, \ "NonTermR":4, "BodyNull":5, "BodyFull":6 , "InitRule":7 } # make the RuleSet and compute the associate DFA RuleSet = Ruleset( Root, Rules ) RuleSet.DoSLRGeneration() # construct the Grammar object Result = kjParser.Grammar( LexD, RuleSet.DFA, Rules, RuleDict ) return Result
BigList[4] = self.MaxStates BigList[5] = self.reducts BigList[6] = self.moveTos BigList[7] = self.Root BigList[8] = self.CaseSensitivity # dump the big list to the file marshal.dump( BigList, self.File ) #end class #######################testing stuff if RUNTESTS: def echo(x): return x # simple grammar stolen from a text LD0 = kjParser.LexDictionary() id = LD0.terminal("id","id",echo) plus = LD0.punctuation("+") star = LD0.punctuation("*") oppar = LD0.punctuation("(") clpar = LD0.punctuation(")") equals = LD0.punctuation("=") E = kjParser.nonterminal("E") T = kjParser.nonterminal("T") Tp = kjParser.nonterminal("Tp") Ep = kjParser.nonterminal("Ep") F = kjParser.nonterminal("F") rule1 = kjParser.ParseRule( E, [ T, Ep ] ) rule2 = kjParser.ParseRule( Ep, [ plus, T, Ep ] ) rule3 = kjParser.ParseRule( Ep, [ ] ) rule4 = kjParser.ParseRule( T, [ F, Tp ] )