Exemplo n.º 1
0
	def __init__(self):
		super(GUI, self).__init__()

		# Set up the user interface from Designer.
		self.ui = Ui_form_main()
		self.ui.setupUi(self)

		# Connect up the buttons.
		self.ui.btn_read.clicked.connect(self.btn_read_clicked)
		self.ui.btn_save.clicked.connect(self.btn_save_clicked)

		self.ui.btn_verify.clicked.connect(self.btn_verify_clicked)
		self.ui.btn_parser.clicked.connect(self.btn_parser_clicked)

		self.ui.btn_recognize.clicked.connect(self.btn_recognize_clicked)

		self.ui.btn_clear.clicked.connect(self.btn_clear_clicked)

		self._current_parser = None
Exemplo n.º 2
0
class GUI(QDialog):
	def __init__(self):
		super(GUI, self).__init__()

		# Set up the user interface from Designer.
		self.ui = Ui_form_main()
		self.ui.setupUi(self)

		# Connect up the buttons.
		self.ui.btn_read.clicked.connect(self.btn_read_clicked)
		self.ui.btn_save.clicked.connect(self.btn_save_clicked)

		self.ui.btn_verify.clicked.connect(self.btn_verify_clicked)
		self.ui.btn_parser.clicked.connect(self.btn_parser_clicked)

		self.ui.btn_recognize.clicked.connect(self.btn_recognize_clicked)

		self.ui.btn_clear.clicked.connect(self.btn_clear_clicked)

		self._current_parser = None

	def default_button_behavior(self):
		print("Not implemented!!!")

	def btn_read_clicked(self):
		file = QFileDialog.getOpenFileName(self, 'Ler a gramática de um arquivo')
		with open(file[0]) as f: s = f.read()
		self.ui.text_grammar.setText(s)
		self.log('Gramática lida do arquivo (%s)'%(file[0]))

	def btn_save_clicked(self):
		file = QFileDialog.getSaveFileName(self, 'Salvar a gramática em um arquivo')
		with open(file[0],'w') as f: s = f.write(self.ui.text_grammar.toPlainText())
		self.log('Gramática salva em arquivo (%s)'%(file[0]))

	def btn_verify_clicked(self):
		if(self.verify_grammar_ll1()):
			QMessageBox.information(self,'Verificar se a gramática é LL(1)','A gramática é LL(1)!')

	def btn_parser_clicked(self):
		if(self.verify_grammar_ll1()):
			g = Grammar.text_to_grammar(self.ui.text_grammar.toPlainText())
			r = RecursiveDescentParser(g)
			self._current_parser = r
			self.ui.text_parser.setText(r.parser_code(self.log).strip().replace('\t','    '))
			QMessageBox.information(self,'Geração do parser descendente recursivo','O parser foi gerado!')

	def btn_clear_clicked(self):
		self.ui.text_log.setText('')

	def btn_recognize_clicked(self):
		if self._current_parser == None:
			QMessageBox.critical(self,'Reconhecimento de sentença','O parser ainda não foi gerado!')
			raise Exception('Reconhecimento de sentença','O parser ainda não foi gerado!')

		try:
			sentence = self.ui.line_sentence.text()
			self.log('Verificando se a sentença "%s" é reconhecida pelo parser'%(sentence))
			self._current_parser.parse(sentence,self.log)
			QMessageBox.information(self,'Reconhecimento de sentença','A sentença "%s" foi reconhecida!'%(sentence))
			self.log('A sentença "%s" foi reconhecida!'%(sentence))
		except Exception as err:
			if err.args[0] == 'PARSING' and err.args[1] == '$':
				QMessageBox.critical(self,'Reconhecimento de sentença','A sentença "%s" NÃO foi reconhecida!\n\n'%(sentence)+'O fim do reconhecimento foi alcançado, mas a sentença\nainda não havia acabado. Estava no símbolo "%s"'%(err.args[2]))
				self.log('Erro durante reconhecimento de "%s", fim de reconhecimento mas a sentença estava no símbolo "%s"'%(sentence,err.args[2]))
				raise Exception('Reconhecimento de sentença','Esperava "$" mas "%s" foi recebido'%(err.args[2]))
			elif err.args[0] == 'PARSING' and isinstance(err.args[2],list):
				symbols = ('", "'.join(err.args[2]))
				QMessageBox.critical(self,'Reconhecimento de sentença','A sentença "%s" NÃO foi reconhecida!\n\n'%(sentence)+'Durante o não terminal "%s" esperava-se:\n"%s" mas "%s" foi recebido'%(err.args[1],symbols,err.args[3]))
				self.log('Erro durante reconhecimento de "%s", durante o não terminal "%s" esperava-se "%s" mas "%s" foi recebido'%(sentence,err.args[1],symbols,err.args[3]))
				raise Exception('Reconhecimento de sentença','Durante "%s" esperava-se "%s" mas "%s" foi recebido'%(err.args[1],symbols,err.args[3]))
			elif err.args[0] == 'PARSING':
				QMessageBox.critical(self,'Reconhecimento de sentença','A sentença "%s" NÃO foi reconhecida!\n\n'%(sentence)+'Durante o não terminal "%s" esperava-se:\n"%s" mas "%s" foi recebido'%(err.args[1],err.args[2],err.args[3]))
				self.log('Erro durante reconhecimento de "%s", durante o não terminal "%s" esperava-se "%s" mas "%s" foi recebido'%(sentence,err.args[1],err.args[2],err.args[3]))
				raise Exception('Reconhecimento de sentença','Durante "%s" esperava-se "%s" mas "%s" foi recebido'%(err.args[1],err.args[2],err.args[3]))
			else:
				QMessageBox.critical(self,'Erro inesperado durante reconhecimento de sentença',err.__repr__())
				raise Exception('Erro inesperado durante reconhecimento de sentença',err.__repr__())

	def verify_grammar_ll1(self):
		self.log('Verificando se a gramática é LL(1)')

		try:
			g = Grammar.text_to_grammar(self.ui.text_grammar.toPlainText())
		except Exception:
			QMessageBox.critical(self,'Erro durante criação da gramática','O texto que foi tentado a conversão para gramática não é válido')
			raise Exception('Erro durante criação da gramática','O texto que foi tentado a conversão para gramática não é válido')

		try:
			g.is_ll1(self.log)
			self.log('A gramática é LL(1)!')
			return True
		except Exception as err:
			if err.args[0] == 'LEFT_RECURSION':
				nts = ', '.join(err.args[1])
				QMessageBox.critical(self,'Recursão à esquerda','Os seguintes não terminais levam a uma recursão à esquerda:\n\t%s'%(nts))
				self.log('Recursão a esquerda encontrada encontrada nos não terminais: %s'%(nts))
				raise Exception('Recursão à esquerda','Os seguintes não terminais levam a uma recursão à esquerda: %s'%(nts))
			elif err.args[0] == 'LEFT_FACTORING':
				nts = ', '.join(err.args[1])
				QMessageBox.critical(self,'Fatoração à esquerda','Os seguintes não terminais não estão fatorados à esquerda:\n\t%s'%(nts))
				self.log('Não fatoração encontrada nos não terminais: %s'%(nts))
				raise Exception('Fatoração à esquerda','Os seguintes não terminais não estão fatorados à esquerda: %s'%(nts))
			elif err.args[0] == 'FIRST_FOLLOW_CONFLICT':
				nts = ', '.join(err.args[1])
				QMessageBox.critical(self,'Conflito first/follow','Houve conflito entre o first e o follow dos seguintes não terminais:\n\t%s'%(nts))
				self.log('Conflito first/follow encontrado nos não terminais: %s'%(nts))
				raise Exception('Conflito first/follow','Houve conflito entre o first e o follow dos seguintes não terminais: %s'%(nts))
			else:
				QMessageBox.critical(self,'Erro inesperado durante verificação LL(1)',err.__repr__())
				raise Exception('Erro inesperado durante verificação LL(1)',err.__repr__())

	def log(self, str):
		self.ui.text_log.append(str)