मैं इनाम पहले से ही दावा किया गया है पता है, लेकिन यहां एक बराबर पार्सर pyparsing में लिखा (प्लस समारोह के लिए समर्थन शून्य या अधिक अल्पविराम delimted तर्क के साथ कॉल) है:
from pyparsing import *
LPAR, RPAR = map(Suppress,"()")
EQ = Literal("=")
name = Word(alphas, alphanums+"_").setName("name")
number = Word(nums).setName("number")
expr = Forward()
operand = Optional('-') + (Group(name + LPAR +
Group(Optional(delimitedList(expr))) +
RPAR) |
name |
number |
Group(LPAR + expr + RPAR))
binop = oneOf("+ - */**")
expr << (Group(operand + OneOrMore(binop + operand)) | operand)
assignment = name + EQ + expr
statement = assignment | expr
यह परीक्षण कोड अपनी बुनियादी माध्यम से ज्ञान प्राप्त पार्सर चलाता है:
tests = """\
sin(pi/2)
y = mx+b
E = mc ** 2
F = m*a
x = x0 + v*t +a*t*t/2
1 - sqrt(sin(t)**2 + cos(t)**2)""".splitlines()
for t in tests:
print t.strip()
print statement.parseString(t).asList()
print
इस उत्पादन देता है:
अब
# enable debugging for name and number expressions
name.setDebug()
number.setDebug()
और हम पहले टेस्ट (इनपुट स्ट्रिंग और एक साधारण स्तंभ शासक दिखाते हैं) Reparse:
sin(pi/2)
[['sin', [['pi', '/', '2']]]]
y = mx+b
['y', '=', ['mx', '+', 'b']]
E = mc ** 2
['E', '=', ['mc', '**', '2']]
F = m*a
['F', '=', ['m', '*', 'a']]
x = x0 + v*t +a*t*t/2
['x', '=', ['x0', '+', 'v', '*', 't', '+', 'a', '*', 't', '*', 't', '/', '2']]
1 - sqrt(sin(t)**2 + cos(t)**2)
[['1', '-', ['sqrt', [[['sin', ['t']], '**', '2', '+', ['cos', ['t']], '**', '2']]]]]
डिबगिंग के लिए, हम इस कोड को जोड़ना
t = tests[0]
print ("1234567890"*10)[:len(t)]
print t
statement.parseString(t)
print
इस उत्पादन देते :
123456789
sin(pi/2)
Match name at loc 4(1,5)
Matched name -> ['sin']
Match name at loc 4(1,5)
Matched name -> ['sin']
Match name at loc 8(1,9)
Matched name -> ['pi']
Match name at loc 8(1,9)
Matched name -> ['pi']
Match name at loc 11(1,12)
Exception raised:Expected name (at char 11), (line:1, col:12)
Match name at loc 11(1,12)
Exception raised:Expected name (at char 11), (line:1, col:12)
Match number at loc 11(1,12)
Matched number -> ['2']
Match name at loc 4(1,5)
Matched name -> ['sin']
Match name at loc 8(1,9)
Matched name -> ['pi']
Match name at loc 8(1,9)
Matched name -> ['pi']
Match name at loc 11(1,12)
Exception raised:Expected name (at char 11), (line:1, col:12)
Match name at loc 11(1,12)
Exception raised:Expected name (at char 11), (line:1, col:12)
Match number at loc 11(1,12)
Matched number -> ['2']
पाइपरिंग पैकर पार्सिंग का भी समर्थन करता है, एक प्रकार पार्स-टाइम ज्ञापन (here पैकिंग के बारे में और पढ़ें)। यहाँ एक ही पार्स अनुक्रम है, लेकिन packrat के साथ सक्षम:
same parse, but with packrat parsing enabled
123456789
sin(pi/2)
Match name at loc 4(1,5)
Matched name -> ['sin']
Match name at loc 8(1,9)
Matched name -> ['pi']
Match name at loc 8(1,9)
Matched name -> ['pi']
Match name at loc 11(1,12)
Exception raised:Expected name (at char 11), (line:1, col:12)
Match name at loc 11(1,12)
Exception raised:Expected name (at char 11), (line:1, col:12)
Match number at loc 11(1,12)
Matched number -> ['2']
यह अन्य पार्सर पुस्तकालयों से डिबगिंग सुविधाओं को देखने के लिए एक दिलचस्प व्यायाम था, और मेरे लिए उपयोगी।
अरे! और रूबी के बारे में क्या? : डी – knoopx