当前位置:网站首页>leetcode:736. LISP syntax parsing [flowery + stack + status enumaotu + slots]
leetcode:736. LISP syntax parsing [flowery + stack + status enumaotu + slots]
2022-07-07 02:24:00 【White speed Dragon King's review】

analysis
Look at knowledge without logic
Enum + auto
Setting up id The state of , It can be understood as “ Static state variables of class ”
Used to judge and identify unique States , You can use is Judge 
solts
About solts Usage of , It can also be understood as “ Static variable of class ”

Once a class is modified , The value of all instances will change
ac code
from enum import Enum, auto
class ExprStatus(Enum):
VALUE = auto() # The initial state
NONE = auto() # Unknown expression type
LET = auto() # let expression
LET1 = auto() # let The expression has been parsed vi Variable
LET2 = auto() # let The expression has parsed the last expression expr
ADD = auto() # add expression
ADD1 = auto() # add The expression has been parsed e1 expression
ADD2 = auto() # add The expression has been parsed e2 expression
MULT = auto() # mult expression
MULT1 = auto() # mult The expression has been parsed e1 expression
MULT2 = auto() # mult The expression has been parsed e2 expression
DONE = auto() # Parsing complete
class Expr:
#__slots__ = 'status', 'var', 'value', 'e1', 'e2'
def __init__(self, status):
self.status = status
self.var = '' # let The variable of vi
self.value = 0 # VALUE The number of States , perhaps LET2 The value of the last expression of the state
self.e1 = self.e2 = 0 # add or mult Two expressions of expression e1 and e2 The numerical
class Solution:
def evaluate(self, expression: str) -> int:
scope = defaultdict(list)
def calculateToken(token: str) -> int:
return scope[token][-1] if token[0].islower() else int(token)
vars = []
s = []
cur = Expr(ExprStatus.VALUE)
i, n = 0, len(expression)
while i < n:
if expression[i] == ' ':
i += 1 # Remove space
continue
if expression[i] == '(':
i += 1 # Remove the left parenthesis
s.append(cur)
cur = Expr(ExprStatus.NONE)
continue
if expression[i] == ')': # In essence, it turns the expression into a token
i += 1 # Remove the closing bracket
if cur.status is ExprStatus.LET2:
token = str(cur.value)
for var in vars[-1]:
scope[var].pop() # Clear scope
vars.pop()
elif cur.status is ExprStatus.ADD2:
token = str(cur.e1 + cur.e2)
else:
token = str(cur.e1 * cur.e2)
cur = s.pop() # Get the upper level status
else:
i0 = i
while i < n and expression[i] != ' ' and expression[i] != ')':
i += 1
token = expression[i0:i]
if cur.status is ExprStatus.VALUE:
cur.value = int(token)
cur.status = ExprStatus.DONE
elif cur.status is ExprStatus.NONE:
if token == "let":
cur.status = ExprStatus.LET
vars.append([]) # Record all variables in the scope of this layer , Convenient for subsequent removal
elif token == "add":
cur.status = ExprStatus.ADD
elif token == "mult":
cur.status = ExprStatus.MULT
elif cur.status is ExprStatus.LET:
if expression[i] == ')': # let The last of the expression expr expression
cur.value = calculateToken(token)
cur.status = ExprStatus.LET2
else:
cur.var = token
vars[-1].append(token) # Record all variables in the scope of this layer , Convenient for subsequent removal
cur.status = ExprStatus.LET1
elif cur.status is ExprStatus.LET1:
scope[cur.var].append(calculateToken(token))
cur.status = ExprStatus.LET
elif cur.status is ExprStatus.ADD:
cur.e1 = calculateToken(token)
cur.status = ExprStatus.ADD1
elif cur.status is ExprStatus.ADD1:
cur.e2 = calculateToken(token)
cur.status = ExprStatus.ADD2
elif cur.status is ExprStatus.MULT:
cur.e1 = calculateToken(token)
cur.status = ExprStatus.MULT1
elif cur.status is ExprStatus.MULT1:
cur.e2 = calculateToken(token)
cur.status = ExprStatus.MULT2
return cur.value
summary
After a few months
I also found a daily problem that I don't even want to see the solution
nice
边栏推荐
- Introduction to RC oscillator and crystal oscillator
- Tips for web development: skillfully use ThreadLocal to avoid layer by layer value transmission
- postgresql之整體查詢大致過程
- 3D激光SLAM:Livox激光雷达硬件时间同步
- [server data recovery] data recovery case of a Dell server crash caused by raid damage
- Halcon实例转OpenCvSharp(C# OpenCV)实现--瓶口缺陷检测(附源码)
- 组合导航:中海达iNAV2产品描述及接口描述
- Twenty or thirty thousand a leaf? "Yang Mou" behind the explosion of plant consumption
- FLIR blackfly s industrial camera: synchronous shooting of multiple cameras through external trigger
- Stm32f4 --- PWM output
猜你喜欢

3D laser slam: time synchronization of livox lidar hardware

人脸识别应用解析

传感器:土壤湿度传感器(XH-M214)介绍及stm32驱动代码

将截断字符串或二进制数据

Command injection of cisp-pte
![[unity notes] screen coordinates to ugui coordinates](/img/e4/fc18dd9b4b0e36ec3e278e5fb3fd23.jpg)
[unity notes] screen coordinates to ugui coordinates

This week's hot open source project!

使用Ceres进行slam必须要弄清楚的几个类和函数

【论文阅读|深读】DNGR:Deep Neural Networks for Learning Graph Representations

Centos8 install MySQL 8.0 using yum x
随机推荐
Metaforce force meta universe development and construction - fossage 2.0 system development
The foreground downloads network pictures without background processing
Alibaba cloud middleware open source past
Lombok同时使⽤@Data和@Builder 的坑
传感器:土壤湿度传感器(XH-M214)介绍及stm32驱动代码
人脸识别应用解析
4--新唐nuc980 挂载initramfs nfs文件系统
FLIR blackfly s industrial camera: explanation and configuration of color correction and code setting method
企业中台建设新路径——低代码平台
MetaForce原力元宇宙开发搭建丨佛萨奇2.0系统开发
postgresql 之 数据目录内部结构 简介
What to do when encountering slow SQL? (next)
Correct use of BigDecimal
Flir Blackfly S 工业相机 介绍
GEE升级,可以实现一件run tasks
6 seconds to understand the book to the Kindle
FLIR blackfly s industrial camera: auto exposure configuration and code
建議收藏!!Flutter狀態管理插件哪家强?請看島上碼農的排行榜!
Lumion 11.0 software installation package download and installation tutorial
Introduction to the internal structure of the data directory of PostgreSQL