# Path: pydsl/grammar/symbol.py
# class TerminalSymbol(Symbol):
# 
#     def __init__(self, gd):
#         if not isinstance(gd, Grammar):
#             raise TypeError("Expected Grammar, got %s" % (gd,))
#         Symbol.__init__(self)
#         if not gd:
#             raise Exception
#         self.gd = gd
# 
#     def __hash__(self):
#         return hash(self.gd)
# 
#     def check(self, data):# ->bool:
#         """Checks if input is recognized as this symbol"""
#         return check(self.gd, data)
# 
#     def first(self):
#         return self.gd.first
# 
#     def __eq__(self, other):
#         """StringTerminalSymbol are equals if definition and names are equal"""
#         try:
#             return self.gd == other.gd
#         except AttributeError:
#             return False
# 
#     def __str__(self):
#         return "<TS: " + str(self.gd) + ">"
# 
# class NonTerminalSymbol(str, Symbol):
#     def __init__(self, name):
#         Symbol.__init__(self)
# 
#     def __str__(self):
#         return "<NonTS: " + self + ">"
# 
#     def __hash__(self):
#         return str.__hash__(self)
# 
#     def __eq__(self, other):
#         if not isinstance(other, NonTerminalSymbol):
#             return False
#         return str.__eq__(self,other)
# 
# class NullSymbol(Symbol):
#     _instance = None
#     def __new__(cls):
#         if not cls._instance:
#             cls._instance = super(NullSymbol, cls).__new__(cls)
#         return cls._instance
# 
#     def __eq__(self, other):
#         return isinstance(other, NullSymbol)
# 
#     def __ne__(self, other):
#         return not self.__eq__(other)
# 
#     def __bool__(self):
#         return False
# 
# Path: pydsl/grammar/BNF.py
# class Production(object):
# 
#     def __init__(self, leftside, rightside):
#         # Left side must have at least one non terminal symbol
#         for element in rightside:
#             if not isinstance(element, Symbol):
#                 raise TypeError
#         self.leftside = tuple(leftside)
#         self.rightside = tuple(rightside)
# 
#     def __str__(self):
#         leftstr = " ".join([x for x in self.leftside])
#         rightstr = " ".join([str(x) for x in self.rightside])
#         return leftstr + "::=" + rightstr
# 
#     def __eq__(self, other):
#         try:
#             if len(self.leftside) != len(other.leftside):
#                 return False
#             if len(self.rightside) != len(other.rightside):
#                 return False
#             if not list_eq(self.leftside, other.leftside):
#                 return False
#             if not list_eq(self.rightside, other.rightside):
#                 return False
#         except AttributeError:
#             return False
#         return True
# 
#     def __hash__(self):
#         return hash(self.leftside) & hash(self.rightside)


import logging
import re
from pydsl.grammar.symbol import TerminalSymbol, NonTerminalSymbol, NullSymbol
from pydsl.grammar.BNF import Production
    from pydsl.grammar.definition import String
    from pydsl.grammar.BNF import BNFGrammar
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with pydsl.  If not, see <http://www.gnu.org/licenses/>.


"""BNF format functions"""

__author__ = "Nestor Arocha"
__copyright__ = "Copyright 2008-2014, Nestor Arocha"
__email__ = "nesaro@gmail.com"

LOG = logging.getLogger(__name__)

""" pydsl Grammar definition file parser """

def __generateStringSymbol(rightside):
    head, tail = rightside.split(",", 1)
    if head != "String":
        raise TypeError
    content = tail
    if len(tail) > 2 and tail[1][0] == "'" and tail[1][-1] == "'":
        content = tail[1][1:-1]
    return TerminalSymbol(String(content))

def __generateWordSymbol(rightside, repository):
    args = rightside.split(",")
    if args[0] != "Word":
        raise TypeError

# Path: pydsl/grammar/symbol.py
# class TerminalSymbol(Symbol):
# 
#     def __init__(self, gd):
#         if not isinstance(gd, Grammar):
#             raise TypeError("Expected Grammar, got %s" % (gd,))
#         Symbol.__init__(self)
#         if not gd:
#             raise Exception
#         self.gd = gd
# 
#     def __hash__(self):
#         return hash(self.gd)
# 
#     def check(self, data):# ->bool:
#         """Checks if input is recognized as this symbol"""
#         return check(self.gd, data)
# 
#     def first(self):
#         return self.gd.first
# 
#     def __eq__(self, other):
#         """StringTerminalSymbol are equals if definition and names are equal"""
#         try:
#             return self.gd == other.gd
#         except AttributeError:
#             return False
# 
#     def __str__(self):
#         return "<TS: " + str(self.gd) + ">"
# 
# class NonTerminalSymbol(str, Symbol):
#     def __init__(self, name):
#         Symbol.__init__(self)
# 
#     def __str__(self):
#         return "<NonTS: " + self + ">"
# 
#     def __hash__(self):
#         return str.__hash__(self)
# 
#     def __eq__(self, other):
#         if not isinstance(other, NonTerminalSymbol):
#             return False
#         return str.__eq__(self,other)
# 
# class NullSymbol(Symbol):
#     _instance = None
#     def __new__(cls):
#         if not cls._instance:
#             cls._instance = super(NullSymbol, cls).__new__(cls)
#         return cls._instance
# 
#     def __eq__(self, other):
#         return isinstance(other, NullSymbol)
# 
#     def __ne__(self, other):
#         return not self.__eq__(other)
# 
#     def __bool__(self):
#         return False
# 
# Path: pydsl/grammar/BNF.py
# class Production(object):
# 
#     def __init__(self, leftside, rightside):
#         # Left side must have at least one non terminal symbol
#         for element in rightside:
#             if not isinstance(element, Symbol):
#                 raise TypeError
#         self.leftside = tuple(leftside)
#         self.rightside = tuple(rightside)
# 
#     def __str__(self):
#         leftstr = " ".join([x for x in self.leftside])
#         rightstr = " ".join([str(x) for x in self.rightside])
#         return leftstr + "::=" + rightstr
# 
#     def __eq__(self, other):
#         try:
#             if len(self.leftside) != len(other.leftside):
#                 return False
#             if len(self.rightside) != len(other.rightside):
#                 return False
#             if not list_eq(self.leftside, other.leftside):
#                 return False
#             if not list_eq(self.rightside, other.rightside):
#                 return False
#         except AttributeError:
#             return False
#         return True
# 
#     def __hash__(self):
#         return hash(self.leftside) & hash(self.rightside)


# Path: pydsl/file/BNF.py
import logging
import re
from pydsl.grammar.symbol import TerminalSymbol, NonTerminalSymbol, NullSymbol
from pydsl.grammar.BNF import Production
    from pydsl.grammar.definition import String
    from pydsl.grammar.BNF import BNFGrammar

#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with pydsl.  If not, see <http://www.gnu.org/licenses/>.


"""BNF format functions"""

__author__ = "Nestor Arocha"
__copyright__ = "Copyright 2008-2014, Nestor Arocha"
__email__ = "nesaro@gmail.com"

LOG = logging.getLogger(__name__)

""" pydsl Grammar definition file parser """

def __generateStringSymbol(rightside):
    head, tail = rightside.split(",", 1)
    if head != "String":
        raise TypeError
    content = tail
    if len(tail) > 2 and tail[1][0] == "'" and tail[1][-1] == "'":
        content = tail[1][1:-1]
    return TerminalSymbol(String(content))

def __generateWordSymbol(rightside, repository):
    args = rightside.split(",")
    if args[0] != "Word":
        raise TypeError

    return TerminalSymbol(repository[args[1]])