# Copyright 2013, Big Switch Networks, Inc.
#
# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
# the following special exception:
#
# LOXI Exception
#
# As a special exception to the terms of the EPL, you may distribute libraries
# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
# that copyright and licensing notices generated by LoxiGen are not altered or removed
# from the LoxiGen Libraries and the notice provided below is (i) included in
# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
# documentation for the LoxiGen Libraries, if distributed in binary form.
#
# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
#
# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
# a copy of the EPL at:
#
# http://www.eclipse.org/legal/epl-v10.html
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# EPL for the specific language governing permissions and limitations
# under the EPL.

import pyparsing as P

kw = P.Keyword
s = P.Suppress
lit = P.Literal

# Useful for marking the type of a parse result (matches the empty string, but
# shows up in the result)
tag = lambda name: P.Empty().setParseAction(P.replaceWith(name))

word = P.Word(P.alphanums + '_')

identifier = word.copy().setName("identifier")

# Type names
scalar_type = word
array_type = P.Combine(word + lit('[') - P.Word(P.alphanums + '_') - lit(']'))
list_type = P.Combine(kw('list') - lit('(') - identifier - lit(')'))
any_type = (array_type | list_type | scalar_type).setName("type name")

# Structs
struct_member = P.Group(any_type - identifier - s(';'))
struct = kw('struct') - identifier - s('{') + \
         P.Group(P.ZeroOrMore(struct_member)) + \
         s('}') - s(';')

# Metadata
metadata_key = P.Or(kw("version")).setName("metadata key")
metadata = tag('metadata') + s('#') - metadata_key - word

grammar = P.ZeroOrMore(P.Group(struct) | P.Group(metadata))
grammar.ignore(P.cppStyleComment)

def parse(src):
    return grammar.parseString(src, parseAll=True)
