예제 #1
0
파일: generator.py 프로젝트: bukzor/pijnu
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)
예제 #2
0
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)