Source code for qnet.misc.parser
# coding=utf-8
#This file is part of QNET.
#
# QNET is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# QNET is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# 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 QNET. If not, see <http://www.gnu.org/licenses/>.
#
# Copyright (C) 2012-2013, Nikolas Tezak
#
###########################################################################
"""
Generic Parser class.
"""
from ply import lex, yacc
import os
[docs]class ParsingError(SyntaxError):
"""
Raised for parsing error.
"""
pass
[docs]class Parser(object):
"""
Base class for a lexer/parser that has the _rules defined as methods
"""
tokens = ()
precedence = ()
def __init__(self, **kw):
self.debug = kw.get('debug', 0)
self.names = {}
try:
modname = os.path.splitext(os.path.basename(__file__))[0] + "_" + self.__class__.__name__
except:
modname = "parser" + "_" + self.__class__.__name__
self.debugfile = modname + ".dbg"
self.tabmodule = modname + "_" + "parsetab"
# print(self.debugfile, self.tabmodule)
# Build the lexer and parser
self.lexer = lex.lex(module=self, debug=self.debug)
self.parser = yacc.yacc(module=self,
debug=self.debug,
debugfile=self.debugfile,
tabmodule=self.tabmodule)
[docs] def parse(self, inputstring):
return self.parser.parse(inputstring, lexer=self.lexer)
[docs] def parse_file(self, filename):
with open(filename, 'r') as inputfile:
filetext = inputfile.read()
return self.parse(filetext)