PLY - 返回多个令牌

2024-02-11

AFAIK 词法 Python 源代码的技术是:

  • 当当前行的缩进级别小于前一行的缩进级别时,产生 DEDENT。如果要关闭多个 INDENT,则生成多个 DEDENT。
  • 当到达输入末尾时,如果存在未闭合的 INDENT,则生成 DEDENT。

现在,使用 PLY:

  • 如何从 t_definition 返回多个标记?
  • 如何创建一个在到达 EOF 时调用的 t_definition?简单的\Z不起作用——PLY 抱怨它匹配空字符串。

据我所知,PLY 没有实现推送解析器接口,而这是使用 bison 最容易解决这个问题的方式。但是,注入您自己的词法分析器包装器非常容易,它可以处理 dedent 令牌队列。

最小的词法分析器实现需要实现token()返回一个对象的方法type and value属性。 (如果您的解析器使用它,您也需要它,但我不会在这里担心这一点。)

现在,我们假设底层(PLY 生成的)词法分析器生成NEWLINE其值是换行符后面的前导空格长度的标记。如果某些行不参与 INDENT/DEDENT 算法,则NEWLINE应抑制这些行;我们在这里不考虑这种情况。一个简单的词法分析器函数示例(仅适用于空格,不适用于制表符)可能是:

# This function doesn't handle tabs. Beware!
def t_NEWLINE(self, t):
  r'\n(?:\s*(?:[#].*)?\n)*\s*'
  t.value = len(t.value) - 1 - t.value.rfind('\n')
  return t

现在我们用一个处理缩进的包装器来包装 PLY 生成的词法分析器:

# WARNING:
# This code hasn't been tested much and it also may be inefficient
# and/or inexact. It doesn't do python-style tab handling. Etc. etc.

from collections import namedtuple, deque

# These are the tokens. We only generate one of each here. If
# we used lineno or didn't trust the parser to not mess with the
# token, we could generate a new one each time.
IndentToken = namedtuple('Token', 'type value')
dedent = IndentToken('DEDENT', None)
indent = IndentToken('INDENT', None)
newline= IndentToken('NEWLINE', None)

class IndentWrapper(object):

  def __init__(self, lexer):
    """Create a new wrapper given the lexer which is being wrapped"""
    self.lexer = lexer
    self.indent_stack = [0]
    # A queue is overkill for this case, but it's simple.
    self.token_queue = deque()
    # This is just in case the ply-generated lexer cannot be called again
    # after it returns None.
    self.eof_reached = False

  def token(self):
    """Return the next token, or None if end of input has been reached"""
    # Do we have any queued tokens?
    if self.token_queue:
      return self.token_queue.popleft()
    # Are we done?
    if self.eof_reached:
      return None
    # Get a token
    t = self.lexer.token()
    if t is None:
      # At end of input, we might need to send some dedents
      self.eof_reached = True
      if len(self.indent_stack) > 1:
        t = dedent
        for i in range(len(self.indent_stack) - 1):
          self.token_queue.append(dedent)
        self.indent_stack = [0]
    elif t.type == "NEWLINE":
      # The NEWLINE token includes the amount of leading whitespace.
      # Fabricate indent or dedents as/if necessary and queue them.
      if t.value > self.indent_stack[-1]:
        self.indent_stack.append(t.value)
        self.token_queue.append(indent)
      else:
        while t.value < self.indent_stack[-1]:
          self.indent_stack.pop()
          self.token_queue.append(dedent)
        if t.value != self.indent_stack[-1]:
          raise IndentError # Or however you indicate errors
    return t
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PLY - 返回多个令牌 的相关文章

  • 在 Python 中,部分函数应用(柯里化)与显式函数定义

    在 Python 中 以下方式是否被认为是更好的风格 根据更一般的 可能是内部使用的功能显式定义有用的功能 或者 使用偏函数应用来显式描述函数柯里化 我将通过一个人为的例子来解释我的问题 假设编写一个函数 sort by scoring 它
  • Python OverflowError:数学范围错误[重复]

    这个问题在这里已经有答案了 当我尝试这个计算时 出现溢出错误 output math exp 1391 12694245 100 我知道发生这种情况是因为使用的数字 超出了双精度数的范围 但有什么方法可以解决这个问题并获得输出值 有人可以帮
  • 生成 Flask 中使用的签名会话 cookie 值

    我正在用另一个需要将项目注入会话的 Flask 服务器代理 Flask 服务器 两台服务器具有相同的密钥 因此加密签名将相同 当使用 Flask 和会话时 http 响应包含一个 Set Cookie 标头session text 其中 t
  • 如何使用playsound模块停止音频?

    如何在Python代码中通过playaudio模块停止音频播放 我播放过音乐 但我无法停止音乐 我怎样才能阻止它 playsound playsound name of file 您可以使用多处理模块将声音作为后台进程播放 然后随时终止它
  • 在 Python 中同时插入行

    我正在尝试对我的代码进行矢量化 但遇到了障碍 我有 nxd x 值数组 x1 xn 其中每一行 x1 有很多点 x11 x1d nxd y 值数组 y1 y2 y3 其中每一行 y1 有很多点 y11 y1d x 值的 nx1 数组 x 1
  • 如何在 Python 2.4 CSV 阅读器中禁用引用?

    我正在编写一个 Python 实用程序 需要解析一个我无法控制的大型且定期更新的 CSV 文件 该实用程序必须在仅提供 Python 2 4 的服务器上运行 CSV 文件根本不引用字段值 但Python 2 4版本的csv库 http ww
  • Huggingface 变形金刚模块未被 anaconda 识别

    我正在使用 Anaconda python 3 7 Windows 10 我尝试通过安装变压器https huggingface co transformers https huggingface co transformers 在我的环境
  • 使用 Matplotlib 的范围绘制图像的 3D 轮廓

    正如我所介绍的here https stackoverflow com questions 18792624 fits image input to a range in plot python 在二维中 我想知道如何 缩放 要绘制到绘图中
  • Python 中嵌套列表的排序和分组

    我有以下数据结构 列表的列表 4 21 1 14 2008 10 24 15 42 58 3 22 4 2somename 2008 10 24 15 22 03 5 21 3 19 2008 10 24 15 45 45 6 21 1 1
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • python - 将cookie添加到cookiejar

    如何在 python 中创建 cookie 并将其添加到 CookieJar 实例 我拥有 cookie 的所有信息 名称 值 域 路径等 但我不想通过 http 请求提取新的 cookie 我尝试了这个 但看起来 SimpleCookie
  • 是否可以在 Jupyter 笔记本中显示控制台?

    我希望能够使用 Jupyter 笔记本中的控制台在环境中进行摆弄 添加额外的单元格意味着我总是必须滚动到最底部或在我想要 类似控制台 文本字段的任何地方创建新单元格 是否可以有一个永久的控制台窗口 例如在窗口底部 Thanks 您可以启动连
  • 从网站上抓取数字和详细信息的数据

    我想从网站上抓取联系电话以及快递服务的相应详细信息 我无法从所有快递服务中获取联系电话和其他详细信息 例如姓名地址和评级 我分析的数据位于脚本标签中 请提出修复此问题的建议 import requests import pandas as
  • 使用 matplotlib 设置或固定二元分布值

    I ve animated a bivariate gaussian distribution using matplotlib 我已经计算过这个distribution通过调整COV matrix来考虑特定的变量 我可以提供有关此过程的更
  • 收到“/:未找到事件。”使用 PyCharm 远程调试器时

    当我使用 PyCharm 通过 ssh 进行远程调试时tcsh shell 服务器 很多时候它停止工作 并显示 未找到事件 更具体地说 我在 pycharm 调试控制台中遇到以下内容 ssh username hostserver 22 p
  • 尝试将 cuda 与 pytorch 一起使用时出现运行时错误 999

    我为我的 Geforce 2080 ti 安装了 Cuda 10 1 和最新的 Nvidia 驱动程序 我尝试运行一个基本脚本来测试 pytorch 是否正常工作 但出现以下错误 RuntimeError cuda runtime erro
  • 返回吃异常

    我至少发现了以下行为weird def errors try ErrorErrorError finally return 10 print errors prints 10 It should raise NameError name E
  • 设置字符串中单词或字符数的限制

    假设我有一个字符串元素列表 wordlist hi what s up home diddle mc doo Oh wise master kakarot hello have a da 我希望列表中的每个元素最多包含 3 个单词或 20
  • 引用与指针的执行速度

    我最近阅读了一篇关于托管语言是否比本机语言 特别是 C 与 C 慢 或快 的讨论 一位参与讨论的人士表示 托管语言的 JIT 编译器将能够对引用进行优化 而这在使用指针的语言中是不可能实现的 我想知道的是 对于引用而不是指针可以进行 什么样
  • 如何继承并重写 django 模型类来创建 listOfStringsField?

    我想为 django 模型创建一个新类型的字段 它基本上是一个 ListOfStrings 因此 在您的模型代码中 您将具有以下内容 模型 py from django db import models class ListOfString

随机推荐

  • 迭代自定义元素中的 HTMLCollection

    如何在另一个自定义元素的 Shadow dom 中迭代一个自定义元素的实例 HTMLCollections 似乎没有按预期运行 我是一个 jQuerian 而且是普通 js 的新手 所以我确信我在某个地方犯了一个明显的错误 HTML
  • 有 CSS 媒体查询来检测 Windows 吗?

    我想指定两种略有不同的背景颜色 一种用于 Mac OS 一种用于 Windows 没有属性来指定用于查看网页的操作系统 但您可以使用 javascript 检测它 这里是检测操作系统的一些示例 var OSName Unknown OS i
  • Heroku 和 Zerigo 设置问题

    EDIT2 等待查看我的更改是否成功 编辑 我使用命令行 Zerigo install 命令重新安装了所有内容 最初的问题是手动设置 现在的问题是 我设置的自定义域无法正常工作 访问自定义域只会在 Chrome 中返回错误 哎呀 Googl
  • 用于构建成就系统的 Ruby/Rails 现代化工具

    我有兴趣为我的 Ruby on Rails 应用程序构建一个强大的成就系统 成就可以通过多种方式实现 通常 我们会有一些可能发生在多个模型上的标准 一些是必需的 一些是触发成就的可选 混合和匹配 我想说这类似于此处或 Foursquare
  • WPF-Prism CanExecute 方法未被调用

    我正在编写一个简单的登录用户控件 其中包含两个文本框 用户名和密码 和一个登录按钮 我希望仅在填写用户名和密码字段时启用登录按钮 我正在使用 Prism 和 MVVM LoginViewModel 包含一个名为 LoginCommand 的
  • 如何替换 Postgres 中的表?

    基本上我想这样做 begin lock table a alter table a rename to b alter table a1 rename to a drop table b commit 即获得控制权并替换我的旧桌子 而没有人
  • java.lang.ArrayIndexOutOfBoundsException : 0 是什么意思

    我的编译器一直指向这一行 arr i new specialDelivery name name2 weight special 和这个 arr i new specialDelivery name name2 weight special
  • Qt5参考文档:qch文件

    我想在 QtAssistant 中查看 Qt 参考文档 但是 Qt5 的安装没有附带 Qt 库的 qch 文档文件 我试图在http qt project org http qt project org但到处都找不到它们 如何获取 Qt5
  • 如何禁用 reCAPTCHA Flask App Builder

    我是 Flask 应用程序构建器的新手 正在尝试设置用户注册 但出于我的目的 我不需要 reCAPTCHA 有没有办法在配置文件中禁用 reCaptcha 我的配置文件如下所示 Uncomment to setup Public role
  • 在调用中使用查询参数时缓存记录? Ember-数据

    我有这条路线检索 2 个模型 App PanelRoute Ember Route extend model function var topologymin this store find topologymin var metricma
  • 自定义字体 Xcode 4.3

    我正在尝试使用这个字体 http www dafont com chalkboard font在我的项目中 但它不起作用 我在项目中添加了 ttf 文件 并将其名称添加到 MyApp Info plist 的键下 应用程序提供的字体 然后我
  • 匿名函数的上下文是什么?

    我有这样的代码 function demo this val 5 function this val 7 现在 当我在 Firefox 或 Chrome 控制台中执行此代码时 它会出现语法错误 我不明白为什么这是一个错误 因为我读过 jav
  • 为什么状态对组件可见?

    据我了解 vuex 的重点是通过仅通过突变 操作 获取器将其暴露给组件来保证状态的一致性 但是 组件可以直接操作 store state 而不使用突变 操作 可能会导致状态不一致 为什么vuex状态直接暴露出来 使用突变 动作 吸气剂等是建
  • 在页面刷新/导航时保留 Twitter Bootstrap 折叠状态

    我正在使用 Bootstrap 折叠 插件为一长串链接制作一个手风琴 Accordion body 标签包含 collapse 因此页面加载时所有组都会折叠 当您打开一个组并单击链接时 它会将您带到一个新页面以查看一些详细信息 然后单击后退
  • Matplotlib 中的日期和时间间隔绘图

    pyplotplot date函数期望以某种线条样式绘制日期和值对 是否有推荐的方法根据日期 时间值绘制多个值或间隔数据 要绘制间隔数据 您可以使用由错误栏 功能及用途axis xaxis date 使 matplotlib 格式化轴 例如
  • Hadoop Namenode 元数据 - fsimage 和编辑日志

    据我所知 出于性能原因 fsimage 在启动时加载到内存中 并且任何进一步的事务都会添加到编辑日志中 而不是添加到 fsimage 中 当namenode重新启动时 内存中的fsimage会被刷新 为了提高效率 辅助名称节点定期执行检查点
  • ckeditor 未加载通过 ajax 调用生成的元素?

    我正在使用自定义表单并通过 ajax 调用生成表单元素 但 textarea 未使用 ckeditor 加载 这是我的代码 阿贾克斯代码 jQuery ajax type POST url reg arz ajax2 php data bo
  • 如果创建了大写字母,则 TextInput 值上的 toLowerCase 会创建重复文本

    这是一个有趣的 我创建了一个 TextInput 它接受一个值 然后将其小写 将其添加到状态 并将其设置为默认值 在我的 Android 物理设备上 如果您强制使用大写字母 自动大写设置为无 然后快速点击其他字母 它将复制并添加额外的文本
  • graphviz 中的自循环边缘太短且难看

    我用graphviz画了一张图 请参见FSM https i stack imgur com bsVUW png 我认为它很丑 因为自环边缘太短 边缘的属性 minlen 对我不起作用 我尝试了节点的几个端口 但除了我当前的实现之外 一切都
  • PLY - 返回多个令牌

    AFAIK 词法 Python 源代码的技术是 当当前行的缩进级别小于前一行的缩进级别时 产生 DEDENT 如果要关闭多个 INDENT 则生成多个 DEDENT 当到达输入末尾时 如果存在未闭合的 INDENT 则生成 DEDENT 现