当前位置:网站首页>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
边栏推荐
- The last line of defense of cloud primary mixing department: node waterline design
- Use of pgpool II and pgpooladmin
- 3D激光SLAM:Livox激光雷达硬件时间同步
- Recent applet development records
- TiFlash 源码阅读(四)TiFlash DDL 模块设计及实现分析
- String or binary data will be truncated
- 激光雷达:Ouster OS产品介绍及使用方法
- 最近小程序开发记录
- How do I dump SoapClient requests for debugging- How to dump SoapClient request for debug?
- 1500万员工轻松管理,云原生数据库GaussDB让HR办公更高效
猜你喜欢

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

【论文阅读|深读】ANRL: Attributed Network Representation Learning via Deep Neural Networks

Processing image files uploaded by streamlit Library

【论文阅读|深读】 GraphSAGE:Inductive Representation Learning on Large Graphs

Stm32f4 --- general timer update interrupt

Robot team learning method to achieve 8.8 times human return

Flir Blackfly S 工业相机:通过外部触发实现多摄像头同步拍摄

Detailed explanation of line segment tree (including tested code implementation)
![[unity] upgraded version · Excel data analysis, automatically create corresponding C classes, automatically create scriptableobject generation classes, and automatically serialize asset files](/img/20/f7fc2204ca165dcea4af25cb054e9b.png)
[unity] upgraded version · Excel data analysis, automatically create corresponding C classes, automatically create scriptableobject generation classes, and automatically serialize asset files

组合导航:中海达iNAV2产品描述及接口描述
随机推荐
UC伯克利助理教授Jacob Steinhardt预测AI基准性能:AI在数学等领域的进展比预想要快,但鲁棒性基准性能进展较慢
Time synchronization of livox lidar hardware -- PPS method
Centos8 install MySQL 8.0 using yum x
最近小程序开发记录
FLIR blackfly s industrial camera: auto exposure configuration and code
低代码平台中的数据连接方式(上)
[leetcode] day97 remove linked list elements
STM32项目 -- 选题分享(部分)
[paper reading | deep reading] dngr:deep neural networks for learning graph representations
postgresql之整體查詢大致過程
1个月增长900w+播放!总结B站顶流恰饭的2个新趋势
[unity] upgraded version · Excel data analysis, automatically create corresponding C classes, automatically create scriptableobject generation classes, and automatically serialize asset files
Introduction to FLIR blackfly s industrial camera
一片葉子兩三萬?植物消費爆火背後的“陽謀”
【森城市】GIS数据漫谈(二)
Several classes and functions that must be clarified when using Ceres to slam
张平安:加快云上数字创新,共建产业智慧生态
Treadpoolconfig thread pool configuration in real projects
如何从0到1构建32Core树莓派集群
老板被隔离了