- Started a new Ifparser.

This commit is contained in:
ccremers
2005-12-03 16:12:58 +00:00
parent 8f222c9bb7
commit 290e5a8b5c
4 changed files with 557 additions and 30 deletions

View File

@@ -7,6 +7,7 @@ from pyparsing import Literal, alphas, nums, Word, oneOf, Or, Group, \
restOfLine, Forward, Optional, delimitedList, alphanums,\
OneOrMore
import Term
import If
typedversion = False
@@ -28,13 +29,13 @@ def ruleParser ():
# ------------------------------------------------------
# Tokens
lbr = Literal("(").suppress()
rbr = Literal(")").suppress()
comma = Literal(",").suppress()
hash = Literal("#").suppress()
equ = Literal("=").suppress()
implies = Literal("=>").suppress()
dot = Literal(".").suppress()
lbr = Literal("(")
rbr = Literal(")")
comma = Literal(",")
hash = Literal("#")
equ = Literal("=")
implies = Literal("=>")
dot = Literal(".")
eol = Literal("\n").suppress()
# Basic constructors
@@ -46,25 +47,25 @@ def ruleParser ():
TypeInfo = oneOf ("mr nonce pk sk fu table")
TypeInfo.setParseAction(lambda s,l,t: [ "typeinfo", Term.TermConstant(t[0]) ])
Constant = Word(alphas,Alfabet)
Constant.setParseAction(lambda s,l,t: [ "constant", Term.TermConstant(t[0]) ])
Constant.setParseAction(lambda s,l,t: [ Term.TermConstant(t[0]) ])
# Time
nTime = Group(Number)
nTime.setParseAction(lambda s,l,t: ["n", t[0] ])
nTime = Number
xTime = Literal("xTime")
xTime.setParseAction(lambda s,l,t: ["x", t[0] ])
sTime = Literal("s").suppress() + lbr + Group(Number) + rbr
sTime.setParseAction(lambda s,l,t: ["s", t[0] ])
Time = Or([nTime,xTime,sTime])
Time.setParseAction(lambda s,l,t: ["time", t[0],t[1] ])
# Const
Const = Forward()
Const << Or ([ Constant, Literal("c") + lbr + Constant + comma + Time + rbr, Literal("c(ni,ni)") ])
ConstC = Literal("c") + lbr + Constant + comma + Time + rbr
ConstF = Literal("c(ni,ni)")
Const << Or ([ Constant, ConstC, ConstF ])
Const.setParseAction(lambda s,l,t: [ If.Constant("".join(t)) ])
# Two versions
Variable = Word("x",Alfabet)
Variable.setParseAction(lambda s,l,t: [ "v", Term.TermVariable(t[0],None) ])
Variable.setParseAction(lambda s,l,t: [ Term.TermVariable(t[0]+"V",None) ])
if typedversion:
Variable = TypeInfo + lbr + Variable + rbr
@@ -99,6 +100,7 @@ def ruleParser ():
varterm = Variable + optprime
Invertible = Or( [pkterm, KeyTableApp, varterm])
PublicCypher = Literal("crypt") + lbr + Invertible + comma + Message + rbr
PublicCypher.setParseAction(lambda s,l,t: [ Term.TermEncrypt(t[2],t[1]) ])
XOR = Literal("rcrypt") + lbr + Message + comma + Message + rbr
SymmetricCypher = Literal("scrypt") + lbr + Message + comma + Message + rbr
futerm = Or([ Literal("fu") + lbr + Const + rbr, Variable ])
@@ -106,6 +108,7 @@ def ruleParser ():
# Message composition
Concatenation = Literal("c") + lbr + Message + comma + Message + rbr
Concatenation.setParseAction(lambda s,l,t: [ Term.TermTuple(t[1],t[2]) ])
Composed = Or([ Concatenation, SymmetricCypher, XOR,
PublicCypher, Function, KeyTable, KeyTableApp ])
Message << Or ([Composed, Atomic])
@@ -136,6 +139,7 @@ def ruleParser ():
# Principal fact
Principal = Literal("w") + lbr + Step + comma + Agent + comma + Agent + comma + MsgList + comma + MsgList + comma + Boolean + comma + Session + rbr
Principal.setParseAction(lambda s,l,t: [ "Principal", t])
# Message fact
MessageFact = Literal("m") + lbr + Step + comma + Agent + comma + Agent + comma + Agent + comma + Message + comma + Session + rbr
@@ -167,7 +171,7 @@ def ruleParser ():
mr1 = Literal("h") + lbr + Literal("s") + lbr + Literal("xTime") + rbr + rbr + dot + MFPrincipal
mr2 = implies
mr3 = Literal("h") + lbr + Literal("xTime") + rbr + dot + MFPrincipal + Optional(dot + delimitedList(GoalFact, "."))
MessageRule = mr1 + mr2 + mr3 ## DEVIANT : BNF requires newlines
MessageRule = Group(mr1) + mr2 + Group(mr3) ## DEVIANT : BNF requires newlines
InitialState = Literal("h") + lbr + Literal("xTime") + rbr + dot + State ## DEVIANT : BNF requires newlines
# Intruder
@@ -200,13 +204,14 @@ def ifParser():
labeledrule = Group(label) + Group(ruleParser())
def labeledruleAction(s,l,t):
print "-----------------"
print "- Detected rule -"
print "-----------------"
if t[0][3] == "Protocol_Rules":
print "-----------------"
print "- Detected rule -"
print "-----------------"
print t[0]
print t[1]
print
print t[0]
print t[1]
print
labeledrule.setParseAction(labeledruleAction)