Skip to content

Instantly share code, notes, and snippets.

@asukaminato0721
Created April 16, 2024 04:47
Show Gist options
  • Save asukaminato0721/f6937f352d6561c88bca286ac9a8f1ce to your computer and use it in GitHub Desktop.
Save asukaminato0721/f6937f352d6561c88bca286ac9a8f1ce to your computer and use it in GitHub Desktop.
simple-parser-v2, support some var
# only consider base case
from enum import Enum, auto
import unittest
import re
from typing import List, Union
class Status(Enum):
Normol = auto()
Number = auto()
Variable = auto()
class Type(Enum):
digit = auto()
operator = auto()
space = auto()
unkonwn = auto()
letter = auto()
s = """ 111 + 2 - 5 / 6 + 888 - a+ ba12fbv """
def str2type(s: str):
if re.match("[0-9]", s):
return Type.digit
if re.match(r"[\+\-\*\/]", s):
return Type.operator
if s.isspace():
return Type.space
if s.isalpha():
return Type.letter
return Type.unkonwn
index = 0
arr: List[Union[str, int]] = []
status = Status.Normol
cur = ""
while index < len(s):
fast = s[index]
match (status, str2type(fast)):
case (Status.Normol, Type.digit):
cur += fast
status = Status.Number
case (Status.Normol, Type.operator):
arr.append(fast)
case (Status.Normol, Type.space):
# ignore
...
case (Status.Normol, Type.letter):
cur += fast
status = Status.Variable
case (Status.Number, Type.digit):
cur += fast
case (Status.Number, Type.operator):
arr.append(int(cur))
cur = ""
arr.append(fast)
status = Status.Normol
case (Status.Number, Type.space):
arr.append(int(cur))
cur = ""
status = Status.Normol
case (Status.Number, Type.letter):
raise Exception("error")
case (Status.Variable, Type.digit | Type.letter):
cur += fast
case (Status.Variable, Type.space):
arr.append(cur)
cur = ""
status = Status.Normol
case (Status.Variable, Type.operator):
arr.append(cur)
cur = ""
arr.append(fast)
status = Status.Normol
case (_, Type.unkonwn):
...
index += 1
arr.append((cur))
class Test(unittest.TestCase):
def test_parser(self):
self.assertEqual(1, 1)
if __name__ == "__main__":
print(arr)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment