Skip to content

Instantly share code, notes, and snippets.

@coderistan
Last active October 18, 2020 13:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save coderistan/7a476ac810f7184de275f4bc4a308a32 to your computer and use it in GitHub Desktop.
Save coderistan/7a476ac810f7184de275f4bc4a308a32 to your computer and use it in GitHub Desktop.
# coding: utf-8
class Parser:
def __init__(self):
self.string = ""
self.token = None
def get_token(self):
if(len(self.string)):
self.token = self.string[0]
self.string = self.string[1:]
else:
self.token = ""
def expect(self,value):
if self.token != value:
raise Exception("Syntax Error")
self.get_token()
def curly(self):
self.expect("{")
self.stmt(1)
self.expect("}")
def bracket(self):
self.expect("(")
self.stmt(1)
self.expect(")")
def square(self):
self.expect("[")
self.stmt(1)
self.expect("]")
def stmt(self,p):
if self.token == "":
return
if self.token == "{":
self.curly()
self.stmt(p)
elif self.token == "(":
self.bracket()
self.stmt(p)
elif self.token == "[":
self.square()
self.stmt(p)
else:
if p == 1:
return
else:
raise Exception("Syntax error")
return
def __call__(self,string):
return self.work(string)
def work(self,string):
self.string = string
while True:
try:
self.get_token()
if(self.token == ""):
break
self.stmt(0)
except Exception as e:
return False
return True
# coding: utf-8
import unittest
from program import Parser
class ProgramTest(unittest.TestCase):
def setUp(self):
self.parser = Parser()
self.case_1 = "[({()}([])[(){}])]"
self.case_2 = "((())())"
self.case_3 = "{}}"
self.case_4 = "(}"
self.case_5 = "(())("
self.case_6 = "(()[])([])"
def test_parser(self):
self.assertTrue(self.parser(self.case_1))
self.assertTrue(self.parser(self.case_2))
self.assertFalse(self.parser(self.case_3))
self.assertFalse(self.parser(self.case_4))
self.assertFalse(self.parser(self.case_5))
self.assertTrue(self.parser(self.case_6))
if __name__ == "__main__":
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment