repos/MysteryMachine

view MysteryMachine/parsetools/grammar.py @ 61:fe9c6208c80c

Fix to yapsy (in patch) that deail with untust Failure.

Also include syntax fix for untrustPlugin in the MM TrustedPluginManager
and tests for the bug.
author Roger Gammans <rgammans@computer-surgery.co.uk>
date Wed Oct 21 23:56:53 2009 +0100 (2009-10-21)
parents 60629872bb01
children a29907c2f491
line source
1 #!/usr/bin/python
3 ###Grammar stuff
4 from pyparsing import Regex,Optional,ZeroOrMore, QuotedString , Literal, Word, alphas , nums , printables , CharsNotIn
5 from functools import partial
7 import sys
10 def Grammar(obj):
11 home=obj
12 #Tokens
13 openExpr = Literal("${")
14 closeExpr = Literal("}")
15 seperator = Literal(":")
16 queryOp = Literal("?")
17 equalsOp = Literal("=")
18 notequalsOp= Literal("!=")
20 identifier = Word(alphas + nums)
21 objectName = identifier.copy()
22 fieldName = identifier.copy()
23 ObjectId = Word(nums)
24 NonExpr = CharsNotIn("$")
26 ExprLimit = Regex("[^ \n\t]*[ \n\t]")
27 Value = QuotedString('"')
29 # Productions
30 cfoperator = equalsOp ^ notequalsOp
31 ObjectUID = Optional(objectName + seperator + ObjectId)
33 NamedField = ObjectUID + seperator +fieldName
34 ExprField = ObjectUID ^ \
35 NamedField
37 BoolExpr = ExprField + cfoperator + Value.copy()
38 QueryExpr = BoolExpr + queryOp + Value.copy() + seperator +Value.copy()
40 ExprText = ExprField ^ \
41 QueryExpr
43 Expr = openExpr + ExprText + closeExpr
44 #Error = openExpr + ExprLimit
46 textEle = NonExpr ^ \
47 Expr
49 text = ZeroOrMore(textEle)
52 ## Functions for parsing.
54 def getField(s,loc,toks):
55 print "bar(%s)\n" % toks
56 field=toks[2]
57 obj=toks[0]
58 return obj[field]
61 def doBool(s,loc,toks):
62 # print "baz\n"
63 sense=(toks[1]=="!=")
64 return sense ^ ( str(toks[0]) == toks[2])
67 def doQuery(s,loc,toks):
68 # print "foo\n"
69 if toks[0]:
70 return toks[2]
71 else:
72 return toks[4]
74 def initFromParse(s,loc,toks):
75 print "Creating form :%s (current=%s)\n"%(toks,repr(home))
76 isSelf=len(toks)==0
77 if isSelf: return home
78 elif home is None: return None
79 else: return home.get_root().get_object(toks[0],toks[2])
81 #def gotError(s,loc,toks):
82 # sys.stderr.write("BARR")
84 ## Bind functions to parse actions
86 NamedField.setParseAction(getField)
88 BoolExpr.setParseAction(doBool)
89 QueryExpr.setParseAction(doQuery)
90 Expr.setParseAction(lambda s,loc,tok:tok[1])
91 #Error.setParseAction(gotError)
93 ObjectUID.setParseAction(initFromParse)
95 return ExprText