V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Cheez
V2EX  ›  Python

解释器如何处理运算符优先级?

  •  1
     
  •   Cheez · 2018-09-25 17:16:33 +08:00 via Android · 2678 次点击
    这是一个创建于 2275 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 python 做了个解释器,其他部分做得都还可以,到了这一部分不知道怎么做,现在只能不考虑优先级,一路平推,所以来 V2EX 问一下。 比如(58 + 6**87/7)/a(7,9...0)

    7 条回复    2018-09-26 12:00:31 +08:00
    Cheez
        1
    Cheez  
    OP
       2018-09-25 17:17:21 +08:00 via Android
    挽尊
    sleeepyy
        2
    sleeepyy  
       2018-09-25 17:22:52 +08:00   ❤️ 1
    建议搜索:逆波兰表达式 or 用栈实现计算器
    vincenteof
        3
    vincenteof  
       2018-09-25 17:41:59 +08:00
    按照算符优先级去生成相应的语法树就行了
    inhzus
        4
    inhzus  
       2018-09-25 17:56:34 +08:00 via Android
    简单点的话 设置运算符优先级,遇到括号递归或用栈实现,GitHub 上计算器很多的
    复杂点的话,就涉及到编译原理的上下文无关语法,就不是一下能说清的了
    AlisaDestiny
        5
    AlisaDestiny  
       2018-09-25 19:56:59 +08:00
    https://blog.gentlehu.com/2014/09/nyoj35-expression-evaluation/
    参考这个。源程序是为了解决 nyoj 第 35 题表达式求值。
    xpresslink
        6
    xpresslink  
       2018-09-26 09:37:48 +08:00
    去看看 pypy 的源码,这个是用的 R-Python 实现的 python JIT
    http://pypy.org/
    agagega
        7
    agagega  
       2018-09-26 12:00:31 +08:00
    让优先级高的作为文法的上一级,比如:

    term := factor '+' factor
    factor := element '*' element

    另一个你需要考虑的问题是结合性,这个用循环就可以搞定。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:48 · PVG 03:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.