summaryrefslogtreecommitdiffstats
path: root/python_modules/spice_parser.py
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2012-03-26 02:40:17 +0200
committerMarc-André Lureau <marcandre.lureau@redhat.com>2012-03-26 02:40:17 +0200
commit3fc870ad553773e4495ba1cdf4af238b29d22dbc (patch)
tree4693deef59c9ed07f16f42409b33114b39730201 /python_modules/spice_parser.py
parent4d8f39020ac83602c1647d4af04e8b19bf74ed6e (diff)
downloadspice-3fc870ad553773e4495ba1cdf4af238b29d22dbc.tar.gz
spice-3fc870ad553773e4495ba1cdf4af238b29d22dbc.tar.xz
spice-3fc870ad553773e4495ba1cdf4af238b29d22dbc.zip
Remove files moved to spice-common
Diffstat (limited to 'python_modules/spice_parser.py')
-rw-r--r--python_modules/spice_parser.py161
1 files changed, 0 insertions, 161 deletions
diff --git a/python_modules/spice_parser.py b/python_modules/spice_parser.py
deleted file mode 100644
index d0aabb09..00000000
--- a/python_modules/spice_parser.py
+++ /dev/null
@@ -1,161 +0,0 @@
-try:
- from pyparsing import Literal, CaselessLiteral, Word, OneOrMore, ZeroOrMore, \
- Forward, delimitedList, Group, Optional, Combine, alphas, nums, restOfLine, cStyleComment, \
- alphanums, ParseException, ParseResults, Keyword, StringEnd, replaceWith
-except ImportError:
- print "Module pyparsing not found."
- exit(1)
-
-
-import ptypes
-import sys
-
-cvtInt = lambda toks: int(toks[0])
-
-def parseVariableDef(toks):
- t = toks[0][0]
- pointer = toks[0][1]
- name = toks[0][2]
- array_size = toks[0][3]
- attributes = toks[0][4]
-
- if array_size != None:
- t = ptypes.ArrayType(t, array_size)
-
- if pointer != None:
- t = ptypes.PointerType(t)
-
- return ptypes.Member(name, t, attributes)
-
-bnf = None
-def SPICE_BNF():
- global bnf
-
- if not bnf:
-
- # punctuation
- colon = Literal(":").suppress()
- lbrace = Literal("{").suppress()
- rbrace = Literal("}").suppress()
- lbrack = Literal("[").suppress()
- rbrack = Literal("]").suppress()
- lparen = Literal("(").suppress()
- rparen = Literal(")").suppress()
- equals = Literal("=").suppress()
- comma = Literal(",").suppress()
- semi = Literal(";").suppress()
-
- # primitive types
- int8_ = Keyword("int8").setParseAction(replaceWith(ptypes.int8))
- uint8_ = Keyword("uint8").setParseAction(replaceWith(ptypes.uint8))
- int16_ = Keyword("int16").setParseAction(replaceWith(ptypes.int16))
- uint16_ = Keyword("uint16").setParseAction(replaceWith(ptypes.uint16))
- int32_ = Keyword("int32").setParseAction(replaceWith(ptypes.int32))
- uint32_ = Keyword("uint32").setParseAction(replaceWith(ptypes.uint32))
- int64_ = Keyword("int64").setParseAction(replaceWith(ptypes.int64))
- uint64_ = Keyword("uint64").setParseAction(replaceWith(ptypes.uint64))
-
- # keywords
- channel_ = Keyword("channel")
- enum32_ = Keyword("enum32").setParseAction(replaceWith(32))
- enum16_ = Keyword("enum16").setParseAction(replaceWith(16))
- enum8_ = Keyword("enum8").setParseAction(replaceWith(8))
- flags32_ = Keyword("flags32").setParseAction(replaceWith(32))
- flags16_ = Keyword("flags16").setParseAction(replaceWith(16))
- flags8_ = Keyword("flags8").setParseAction(replaceWith(8))
- channel_ = Keyword("channel")
- server_ = Keyword("server")
- client_ = Keyword("client")
- protocol_ = Keyword("protocol")
- typedef_ = Keyword("typedef")
- struct_ = Keyword("struct")
- message_ = Keyword("message")
- image_size_ = Keyword("image_size")
- bytes_ = Keyword("bytes")
- cstring_ = Keyword("cstring")
- switch_ = Keyword("switch")
- default_ = Keyword("default")
- case_ = Keyword("case")
-
- identifier = Word( alphas, alphanums + "_" )
- enumname = Word( alphanums + "_" )
-
- integer = ( Combine( CaselessLiteral("0x") + Word( nums+"abcdefABCDEF" ) ) |
- Word( nums+"+-", nums ) ).setName("int").setParseAction(cvtInt)
-
- typename = identifier.copy().setParseAction(lambda toks : ptypes.TypeRef(str(toks[0])))
-
- # This is just normal "types", i.e. not channels or messages
- typeSpec = Forward()
-
- attributeValue = integer ^ identifier
- attribute = Group(Combine ("@" + identifier) + Optional(lparen + delimitedList(attributeValue) + rparen))
- attributes = Group(ZeroOrMore(attribute))
- arraySizeSpecImage = Group(image_size_ + lparen + integer + comma + identifier + comma + identifier + rparen)
- arraySizeSpecBytes = Group(bytes_ + lparen + identifier + comma + identifier + rparen)
- arraySizeSpecCString = Group(cstring_ + lparen + rparen)
- arraySizeSpec = lbrack + Optional(identifier ^ integer ^ arraySizeSpecImage ^ arraySizeSpecBytes ^arraySizeSpecCString, default="") + rbrack
- variableDef = Group(typeSpec + Optional("*", default=None) + identifier + Optional(arraySizeSpec, default=None) + attributes - semi) \
- .setParseAction(parseVariableDef)
-
- switchCase = Group(Group(OneOrMore(default_.setParseAction(replaceWith(None)) + colon | Group(case_.suppress() + Optional("!", default="") + identifier) + colon)) + variableDef) \
- .setParseAction(lambda toks: ptypes.SwitchCase(toks[0][0], toks[0][1]))
- switchBody = Group(switch_ + lparen + delimitedList(identifier,delim='.', combine=True) + rparen + lbrace + Group(OneOrMore(switchCase)) + rbrace + identifier + attributes - semi) \
- .setParseAction(lambda toks: ptypes.Switch(toks[0][1], toks[0][2], toks[0][3], toks[0][4]))
- messageBody = structBody = Group(lbrace + ZeroOrMore(variableDef | switchBody) + rbrace)
- structSpec = Group(struct_ + identifier + structBody + attributes).setParseAction(lambda toks: ptypes.StructType(toks[0][1], toks[0][2], toks[0][3]))
-
- # have to use longest match for type, in case a user-defined type name starts with a keyword type, like "channel_type"
- typeSpec << ( structSpec ^ int8_ ^ uint8_ ^ int16_ ^ uint16_ ^
- int32_ ^ uint32_ ^ int64_ ^ uint64_ ^
- typename).setName("type")
-
- flagsBody = enumBody = Group(lbrace + delimitedList(Group (enumname + Optional(equals + integer))) + Optional(comma) + rbrace)
-
- messageSpec = Group(message_ + messageBody + attributes).setParseAction(lambda toks: ptypes.MessageType(None, toks[0][1], toks[0][2])) | typename
-
- channelParent = Optional(colon + typename, default=None)
- channelMessage = Group(messageSpec + identifier + Optional(equals + integer, default=None) + semi) \
- .setParseAction(lambda toks: ptypes.ChannelMember(toks[0][1], toks[0][0], toks[0][2]))
- channelBody = channelParent + Group(lbrace + ZeroOrMore( server_ + colon | client_ + colon | channelMessage) + rbrace)
-
- enum_ = (enum32_ | enum16_ | enum8_)
- flags_ = (flags32_ | flags16_ | flags8_)
- enumDef = Group(enum_ + identifier + enumBody + attributes - semi).setParseAction(lambda toks: ptypes.EnumType(toks[0][0], toks[0][1], toks[0][2], toks[0][3]))
- flagsDef = Group(flags_ + identifier + flagsBody + attributes - semi).setParseAction(lambda toks: ptypes.FlagsType(toks[0][0], toks[0][1], toks[0][2], toks[0][3]))
- messageDef = Group(message_ + identifier + messageBody + attributes - semi).setParseAction(lambda toks: ptypes.MessageType(toks[0][1], toks[0][2], toks[0][3]))
- channelDef = Group(channel_ + identifier + channelBody - semi).setParseAction(lambda toks: ptypes.ChannelType(toks[0][1], toks[0][2], toks[0][3]))
- structDef = Group(struct_ + identifier + structBody + attributes - semi).setParseAction(lambda toks: ptypes.StructType(toks[0][1], toks[0][2], toks[0][3]))
- typedefDef = Group(typedef_ + identifier + typeSpec + attributes - semi).setParseAction(lambda toks: ptypes.TypeAlias(toks[0][1], toks[0][2], toks[0][3]))
-
- definitions = typedefDef | structDef | enumDef | flagsDef | messageDef | channelDef
-
- protocolChannel = Group(typename + identifier + Optional(equals + integer, default=None) + semi) \
- .setParseAction(lambda toks: ptypes.ProtocolMember(toks[0][1], toks[0][0], toks[0][2]))
- protocolDef = Group(protocol_ + identifier + Group(lbrace + ZeroOrMore(protocolChannel) + rbrace) + semi) \
- .setParseAction(lambda toks: ptypes.ProtocolType(toks[0][1], toks[0][2]))
-
- bnf = ZeroOrMore (definitions) + protocolDef + StringEnd()
-
- singleLineComment = "//" + restOfLine
- bnf.ignore( singleLineComment )
- bnf.ignore( cStyleComment )
-
- return bnf
-
-
-def parse(filename):
- try:
- bnf = SPICE_BNF()
- types = bnf.parseFile(filename)
- except ParseException, err:
- print >> sys.stderr, err.line
- print >> sys.stderr, " "*(err.column-1) + "^"
- print >> sys.stderr, err
- return None
-
- for t in types:
- t.resolve()
- t.register()
- protocol = types[-1]
- return protocol