def formula(): print ("=== sample1: formula ===") formulaGrammar = """\ formula <toolset> def doAdd(node): (n1,n2) = (node[0].value,node[1].value) node.value = n1 + n2 def doMult(node): (n1,n2) = (node[0].value,node[1].value) node.value = n1 * n2 <definition> digit : [0..9.] number : digit+ : join toReal ADD : '+' : drop MULT : '*' : drop LPAREN : '(' : drop RPAREN : ')' : drop mult : (grup/number) MULT (grup/mult/number) : @ add : (grup/mult/number) ADD (grup/add/mult/number) : @ grup : LPAREN (add / mult) RPAREN : @ liftNode formula : add / mult / digit """ makeParser(formulaGrammar) # test from formulaParser import formulaParser formulaParser.test("9*8+01*2.3+45*67*(89+01.2)") print 9*8+01*2.3+45*67*(89+01.2) print formulaParser.match("9*8+01*2.3+45*67*(89+01.2)") Node.TREE_VIEW=True print formulaParser.match("9*8+01*2.3+45*67*(89+01.2)")
def formula(): print("=== sample1: formula ===") formulaGrammar = """\ formula <toolset> def doAdd(node): (n1,n2) = (node[0].value,node[1].value) node.value = n1 + n2 def doMult(node): (n1,n2) = (node[0].value,node[1].value) node.value = n1 * n2 <definition> digit : [0..9.] number : digit+ : join toReal ADD : '+' : drop MULT : '*' : drop LPAREN : '(' : drop RPAREN : ')' : drop mult : (grup/number) MULT (grup/mult/number) : @ add : (grup/mult/number) ADD (grup/add/mult/number) : @ grup : LPAREN (add / mult) RPAREN : @ liftNode formula : add / mult / digit """ makeParser(formulaGrammar) # test from formulaParser import formulaParser formulaParser.test("9*8+01*2.3+45*67*(89+01.2)") print 9 * 8 + 01 * 2.3 + 45 * 67 * (89 + 01.2) print formulaParser.match("9*8+01*2.3+45*67*(89+01.2)") Node.TREE_VIEW = True print formulaParser.match("9*8+01*2.3+45*67*(89+01.2)")
def meta(): # pijnu self meta parsing (!) print ("=== sample3: metaMeta ===") pijnuGrammar = open("pijnu.test",'r').read() makeParser(pijnuGrammar,"pijnuParser1.py") end() ################################################################ ### test produced meta parser from pijnuParser1 import pijnuParser print ("\n=== meta meta test ===") # test with debug grammar debugGrammar = """\ # with recursive patterns debug <toolset> def toReal(node): node.value = float(node.value) <definition> SEP : ' ' : drop DOT : '.' digit : [0..9] integer : digit+ : join real : integer DOT integer? : debug join number : real / integer : toReal # top pattern moreNum : SEP number : liftNode numbers : number (moreNum)* : extract """ print ("\n=== writing debug parser") makeParser(debugGrammar, "debug.py", pijnuParser) print ("\n=== testing debug parser") from debug import debugParser debugParser.digit.test("9 8 . 7", "findAll") debugParser.test("9 9.9 999.99 0.") # test with formula grammar formulaGrammar = """\ formula <definition> { digit : [0..9.] number : digit+ : join real ADD : '+' : drop MULT : '*' : drop LPAREN : '(' : drop RPAREN : ')' : drop multTerm : grup / number moreMult : MULT multTerm : liftNode mult : (grup/number) MULT (grup/mult/number) : @ addTerm : grup / mult / number moreAdd : ADD multTerm : liftNode add : (grup/mult/number) ADD (grup/add/mult/number) : @ grup : LPAREN (add / mult) RPAREN : @ liftNode formula : add / mult / digit } """ print ("\n=== writing formula parser") makeParser(formulaGrammar, "formula.py", pijnuParser) print ("\n=== testing formula parser") from formula import formulaParser formulaParser.test("9*8+01*2.3+45*67*(89+01.2)") # test with wiki grammar wikiGrammar = """\ wiki <definition> { # inline text lineChar : [\\x20..\\xff] rawChar : [\\x20..\\xff !!/!_] DISTINCT : "//" : drop IMPORTANT : "!!" : drop MONOSPACE : "__" : drop rawText : rawChar+ : join distinctText : DISTINCT inline DISTINCT : liftValue importantText : IMPORTANT inline IMPORTANT : liftValue warningText : MONOSPACE inline MONOSPACE : liftValue styledText : distinctText / importantText / warningText text : styledText / rawText inline : text+ : @ # line types LF : '\n' CR : '\r' EOL : (LF/CR)+ : drop BULLETLIST : "*" : drop NUMBERLIST : "#" : drop TITLE : "=" : drop paragraf : !(BULLETLIST/NUMBERLIST) inline EOL : liftValue paragrafs : paragraf+ bulletListItem : BULLETLIST inline EOL : liftValue bulletList : bulletListItem+ numberListItem : NUMBERLIST inline EOL : liftValue numberList : numberListItem+ blankLine : EOL body : (bulletList / numberList / paragrafs / blankLine)+ #body : (bulletListItem / numberListItem / paragraf / blankLine)+ title : TITLE inline EOL : liftValue text : blankLine* title? body } """ print ("\n=== writing wiki parser") makeParser(wikiGrammar, "wiki.py", pijnuParser) from wiki import wikiParser inline = "a //bb// !!cc!! d //ee !!fff __ggggg__ hhh!! ii// j" wikiParser.inline.test(inline) wikiText = """ =F1 - !!GP de Malaisie!! -- //Du malaise dans l'air// Moins d'une semaine après l'ouverture des festivités (hostilités ?) à Melbourne, le //Formula One Circus// installe son barnum en Malaisie, sur le circuit de Sepang. Un tracé que les ingénieurs et les pilotes connaissent dans ses moindres recoins. Situé au beau milieu de la jungle, Sepang est un peu le //jardin// de !!Ferrari!! qui y totalise cinq succès en dix courses. Mais en ce début de saison, la //nouvelle !!réglementation!! technique// a eu pour effet de chambouler la hiérarchie. Et si Brawn GP devrait rester aux avant postes, les gros bras * Ferrari * McLaren * !!Renault!! devraient sensiblement réduire l'écart. Suffisamment pour vaincre ? Pas si sûr, car # BMW et Kubica ont été rapides à //Melbourne//, # Williams # Toyota # Red Bull ont également prouvé un haut niveau de performances. """ wikiParser.test(wikiText)
def meta(): # pijnu self meta parsing (!) print("=== sample3: metaMeta ===") pijnuGrammar = open("pijnu.test", 'r').read() makeParser(pijnuGrammar, "pijnuParser1.py") end() ################################################################ ### test produced meta parser from pijnuParser1 import pijnuParser print("\n=== meta meta test ===") # test with debug grammar debugGrammar = """\ # with recursive patterns debug <toolset> def toReal(node): node.value = float(node.value) <definition> SEP : ' ' : drop DOT : '.' digit : [0..9] integer : digit+ : join real : integer DOT integer? : debug join number : real / integer : toReal # top pattern moreNum : SEP number : liftNode numbers : number (moreNum)* : extract """ print("\n=== writing debug parser") makeParser(debugGrammar, "debug.py", pijnuParser) print("\n=== testing debug parser") from debug import debugParser debugParser.digit.test("9 8 . 7", "findAll") debugParser.test("9 9.9 999.99 0.") # test with formula grammar formulaGrammar = """\ formula <definition> { digit : [0..9.] number : digit+ : join real ADD : '+' : drop MULT : '*' : drop LPAREN : '(' : drop RPAREN : ')' : drop multTerm : grup / number moreMult : MULT multTerm : liftNode mult : (grup/number) MULT (grup/mult/number) : @ addTerm : grup / mult / number moreAdd : ADD multTerm : liftNode add : (grup/mult/number) ADD (grup/add/mult/number) : @ grup : LPAREN (add / mult) RPAREN : @ liftNode formula : add / mult / digit } """ print("\n=== writing formula parser") makeParser(formulaGrammar, "formula.py", pijnuParser) print("\n=== testing formula parser") from formula import formulaParser formulaParser.test("9*8+01*2.3+45*67*(89+01.2)") # test with wiki grammar wikiGrammar = """\ wiki <definition> { # inline text lineChar : [\\x20..\\xff] rawChar : [\\x20..\\xff !!/!_] DISTINCT : "//" : drop IMPORTANT : "!!" : drop MONOSPACE : "__" : drop rawText : rawChar+ : join distinctText : DISTINCT inline DISTINCT : liftValue importantText : IMPORTANT inline IMPORTANT : liftValue warningText : MONOSPACE inline MONOSPACE : liftValue styledText : distinctText / importantText / warningText text : styledText / rawText inline : text+ : @ # line types LF : '\n' CR : '\r' EOL : (LF/CR)+ : drop BULLETLIST : "*" : drop NUMBERLIST : "#" : drop TITLE : "=" : drop paragraf : !(BULLETLIST/NUMBERLIST) inline EOL : liftValue paragrafs : paragraf+ bulletListItem : BULLETLIST inline EOL : liftValue bulletList : bulletListItem+ numberListItem : NUMBERLIST inline EOL : liftValue numberList : numberListItem+ blankLine : EOL body : (bulletList / numberList / paragrafs / blankLine)+ #body : (bulletListItem / numberListItem / paragraf / blankLine)+ title : TITLE inline EOL : liftValue text : blankLine* title? body } """ print("\n=== writing wiki parser") makeParser(wikiGrammar, "wiki.py", pijnuParser) from wiki import wikiParser inline = "a //bb// !!cc!! d //ee !!fff __ggggg__ hhh!! ii// j" wikiParser.inline.test(inline) wikiText = """ =F1 - !!GP de Malaisie!! -- //Du malaise dans l'air// Moins d'une semaine après l'ouverture des festivités (hostilités ?) à Melbourne, le //Formula One Circus// installe son barnum en Malaisie, sur le circuit de Sepang. Un tracé que les ingénieurs et les pilotes connaissent dans ses moindres recoins. Situé au beau milieu de la jungle, Sepang est un peu le //jardin// de !!Ferrari!! qui y totalise cinq succès en dix courses. Mais en ce début de saison, la //nouvelle !!réglementation!! technique// a eu pour effet de chambouler la hiérarchie. Et si Brawn GP devrait rester aux avant postes, les gros bras * Ferrari * McLaren * !!Renault!! devraient sensiblement réduire l'écart. Suffisamment pour vaincre ? Pas si sûr, car # BMW et Kubica ont été rapides à //Melbourne//, # Williams # Toyota # Red Bull ont également prouvé un haut niveau de performances. """ wikiParser.test(wikiText)