使用 PEG.js 解析缩进级别

2024-01-26

我基本上有同样的问题Python 风格缩进的 PEG https://stackoverflow.com/questions/4205442/peg-for-python-style-indentation,但我想得到更多关于这个答案 https://stackoverflow.com/a/10708913/711902.

答案成功生成一个字符串数组,每行输入的行之间都有“INDENT”和“DEDENT”。看起来他几乎使用 PEG.js 来标记化,但没有发生真正的解析。

那么我如何扩展他的示例来进行一些实际的解析呢?

举个例子,我如何改变这个语法:

start = obj
obj = id:id children:(indent obj* outdent)?
    {
        if (children) {
            let o = {}; o[id] = children[1];
            return o;
        } else {
            return id;
        }
    }
id = [a-z]
indent = '{'
outdent = '}'

使用缩进而不是大括号来划分块,并且仍然得到相同的输出?

(Use http://pegjs.majda.cz/在线 http://pegjs.majda.cz/online使用以下输入测试该语法:a{bcd{zyx{}}})


Parser:

// do not use result cache, nor line and column tracking

{ var indentStack = [], indent = ""; }

start
  = INDENT? l:line
    { return l; }

line
  = SAMEDENT line:(!EOL c:. { return c; })+ EOL?
    children:( INDENT c:line* DEDENT { return c; })?
    { var o = {}; o[line] = children; return children ? o : line.join(""); }

EOL
  = "\r\n" / "\n" / "\r"

SAMEDENT
  = i:[ \t]* &{ return i.join("") === indent; }

INDENT
  = &(i:[ \t]+ &{ return i.length > indent.length; }
      { indentStack.push(indent); indent = i.join(""); pos = offset; })

DEDENT
  = { indent = indentStack.pop(); }

Input:

a
  b
  c
  d
    z
    y
    x

Output:

{
   "a": [
      "b",
      "c",
      {
         "d": [
            "z",
            "y",
            "x"
         ]
      }
   ]
}

它无法解析空对象(最后x),但是,它应该很容易解决。这里的技巧是SAMEDENT规则,当缩进级别没有改变时它会成功。INDENT and DEDENT更改当前缩进级别而不更改文本中的位置pos = offset.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PEG.js 解析缩进级别 的相关文章

  • 继续使用 sketch.js 编辑草图图像 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在使用 sketch js 中的示例 http intridea github io sketch js http intridea g
  • 使用 AppleScript 单击 safari 网页按钮

    我想弄清楚如何单击网页中的按钮 例如 点击谷歌网页中的 手气不错 按钮 这是我尝试过的 tell application Safari make new document with properties URL https www goog
  • 如何通过 JS 中的 WebPack 包提供全局 TypeScript 类

    我目前正在研究 TypeScript 我想用 TS 替换 JS 但是我有很多 JS 文件 所以我只想在 TS 中创建新类 并想在我的旧 JS 文件 atm 中使用这些类 后来我想把所有的JS都换成TS 我对 webpack 和捆绑的 js
  • 差异:查看页面源代码与在 Firebug 中查看

    当我查看页面的页面源时 例如 http my sa ucsb edu public curriculum coursesearch aspx http my sa ucsb edu public curriculum coursesearc
  • 尝试为每一行编写测试用例

    已经编写了跳跃方法的测试用例 但当我看到代码覆盖率报告时 它不会进入onloadend方法seat onloadend 在 createSpyObj 中我调用了 loadend 但它仍然没有进入内部 你们能告诉我如何解决它吗 下面提供我的代
  • 非法的break语句(Node.js)

    尝试在 Node js 和 MongoDB 中查找唯一 ID 方法是创建一个 while 循环来查询 MongoDB 中的现有 ID 直到找到唯一值 如果 ID 已被使用 则最后的数字会递增 直到 Mongo 不返回任何内容 一切正常 除了
  • Razorpay 支付集成 -> 我如何检测关闭按钮 X 附近的 razorpay 模型

    我在 CI 框架中使用 Razorpay 当用户在没有付款的情况下关闭时 创建 razor 支付模型 然后对于取消订单 我希望通过状态更改为已取消来触发查询 那么我怎样才能检测到这一点 我已经在使用 by click jQuery 点击关闭
  • VueJS - 验证表单文件上传中的文件大小要求

    我正在使用 Bootstrap Vue 表单制作一个简单的表单 用户可以在其中上传文件 有没有办法验证使用 Vue 表单选择的文件的大小 我想阻止用户上传此类文件 我见过this https stackoverflow com questi
  • 替换后正确的子串位置

    我有一个由用户提供的这样的函数 function replace function string return string replace smile g replace foo bar baz g text 1 我有这样的输入字符串 v
  • 由于运行 Javascript,Firefox 选择下拉列表不断刷新/恢复为默认选项 - AngularJS

    我正在 AngularJS 中构建一个应用程序 但在使用 Firefox 时无法选择下拉菜单 当我单击选择菜单并将鼠标悬停在选项上时 它会将所选选项从光标悬停的选项重置为默认 第一个选项 当选项数量很大时 选择正确的选项变得非常困难 该应用
  • 在 X 轴刻度上渲染 HTML

    我想在 D3 图表的 x 轴上渲染 HTML 基本上 我希望轴上的每个标签都是到数据中另一列的超链接 我试过了 x domain data map function d return a href d Name a 但它根本不起作用 我得到
  • 您可以编写期望抛出异常的异步测试吗?

    我正在编写一个异步测试 期望异步函数像这样抛出 it expects to have failed async gt let getBadResults async gt await failingAsyncTest expect awai
  • 对数组进行分组并获取计数[重复]

    这个问题在这里已经有答案了 假设我有这样的数组 foo bar foo bar bar bar zoom 我想将其分组 这样我就可以得到这样的计数 foo 2 bar 4 zoom 1 有没有一个实用程序可以做到这一点 只需使用该功能Arr
  • 在 GeoJson 数据接收到的 Google 地图多边形上放置标签

    我想将带有信息的标签 或带有标签的 div 放在由下面的代码片段绘制的多边形上 样式属性已成功应用于要素 多边形类型 有谁知道如何向该特征添加文本并将其显示在多边形的中心 function handleGeoJson data map da
  • 如何从客户端 JavaScript 调用特定的 Node.js 方法

    在我的应用程序中 我在 node js 文件中创建了许多方法 我如何从客户端 JavaScript 调用特定方法 下面是我的node js 文件 exports method1 function exports method2 functi
  • 将 SVG 下载为 PNG 图像

    我想将 HTML 页面中的 SVG 元素下载为 PNG 格式 我尝试了此操作 但下载了一个空白的 PNG 图像 如何将我的 HTML SVG 下载为 PNG 我用过这个https bl ocks org biovisualize 81878
  • Angular 中的动态子组件

    我正在构建一个具有一致的元素列表设计模式的应用程序 如果我有一个 A 类型的对象 我会创建AComponent它接受a作为输入 然后创建另一个组件来迭代 A 列表 AListComponent 那么如果我有一个对象 B 我需要做同样的事情
  • JavaScript - 替换 html 字符串中的特定单词索引

    我在 JS 字符串操作方面面临着一项具有挑战性的任务 有一个 HTML 字符串 我需要在其中替换特定单词索引处的单词 单词索引是忽略 HTML 标签时单词的编号 例如 下面是 HTML 字符串 span style font family
  • HTTPS 网站上的 ShareThis 按钮不可点击

    我已将 共享此 按钮添加到我的安全站点 现在单击它们时会产生错误 下面提到了错误 以前有人遇到过这个问题吗 阻止加载混合活动内容 http w sharethis com button buttons js http w sharethis
  • 如何使用javascript取消设置变量? [复制]

    这个问题在这里已经有答案了 这是我到目前为止所尝试的 var nxt I am next window onscroll function var scr this pageYOffset if scr gt 400 console log

随机推荐

  • GEKKO - 使用自定义目标函数进行参数估计 - 错误代码 -13

    我已经使用 Gekko 教程 线性和非线性回归 中介绍的相同技术成功地执行了稳态参数估计 下面是代码 coding utf 8 Spyder Editor This is a temporary script file from io im
  • WordPress:如何计算标签上的帖子数量

    我有个问题 如何计算某个标签的帖子数量 例子 标记照片 67 Thanks 使用下面的代码 taxonomy category can be category post tag or custom taxonomy name Using T
  • 单例类如何使用接口?

    我在很多地方读到单例可以使用接口 有些我无法理解这一点 每个类都可以实现一个接口 而 Singleton 只是一个 普通 类 它确保除了它可能实现的其他业务逻辑之外 在任何时间点都只存在它的一个实例 这也意味着 Singleton 至少有
  • 在 ColdFusion 中将文件保存到服务器

    经过一些研究后 我觉得这应该可行 但是它没有将文件保存到我的图像目录中
  • 消除 Ref# 参考不存在问题

    In the UpdateDemogInfoDA脚本中 我允许用户输入新信息 在另一个工作表 JBD 中捕获该信息 然后使用 示例数据 选项卡中的新信息覆盖旧信息 然后 当按下新的查找按钮时 将根据以下公式查找CustID填充 由于某种原因
  • 如何在 Bucardo Postgresql multi master 中处理序列

    我们正在三个不同的 Postgresql 服务器上设置一个数据库 将来可能会在更多服务器上 目前使用 bucardo 多主组同步所有表 我们不同步序列 我们尝试过 我们注意到当同时写入发生在不同服务器上的同一个表中时 布卡多会让我们丢失数据
  • 用户是否已经“喜欢”Facebook 帖子

    我已经尝试解决这个问题有一段时间了 并且慢慢意识到我拨打的电话并不是我想要的电话 我目前正在获取用户新闻源并添加一个 喜欢 按钮 但如果他们已经喜欢它 则应该说 不喜欢 我打电话给 me likes 并获得了一些数据 我通过比较新闻源中的每
  • 如何避免单元测试中的Thread.sleep?

    假设我有以下应该测试的方法 Autowired private RoutingService routingservice public void methodToBeTested Object objectToRoute initiali
  • WPF 图像源与 StringFormat 绑定

    我是 WPF 和 MVVM 的新手 本周开始尝试 并尝试在运行时绑定图像资源 我尝试显示的项目包含一个枚举属性 该属性指示项目的类型或状态 public class TraceEvent
  • 如何从服务器执行 GraphQL 查询

    我正在使用 graphql express 创建一个端点 我可以在其中执行 graphql 查询 虽然我将 Sequelize 与 SQL 数据库一起使用 但直接从 graphql 之外的服务器使用它感觉不对resolve功能 如何从定义它
  • VB 2010 - 具有标签名称值的变量

    我正在使用 VB 2010 Express 并且我的表单中有一个名为 lblTitle 的标签 下一个代码不起作用 我知道 但我该如何做这样的事情呢 Dim bla As String bla lblTitle bla Text Hello
  • 检查 Android 中的 VPN 连接是否处于活动状态?

    我的非 root Android 4 4 设备上有一个第三方 VPN 应用程序 并且想要编写一个后台服务来监视 VPN 连接并在 VPN 连接已断开时提醒用户 有没有办法做到这一点 我找不到任何使用 VPNService API 的方法 感
  • 在 Apache Camel 应用程序中,单元测试如何注入模拟端点来代替真实端点?

    我正在实施一个消息翻译模式 http camel apache org message translator html使用 Apache Camel 使用来自 RESTful 端点的消息并将它们发送到 AMQP 端点 封闭的应用程序基于 S
  • “showkeyboard”事件来自哪里?

    我正在使用 PhoneGap 我需要在 Android 手机上捕获 键盘正在显示 事件 我发现一些线程说要使用 showkeyboard 事件 例如这个 显示隐藏键盘在 Android PhoneGap 中无法正常工作 https stac
  • 摆脱签名 Java Applet 安全对话框

    这可能是一个荒谬的问题 我有一个签名的小程序 它只能在客户端的计算机文件系统上读写 我可以从像 Verysign 或 Thawte 等知名机构购买数字证书来签署小程序 如果我使用上述权限签署小程序 我可以摆脱 Java 插件持有的这种不明确
  • 使用 python3 中现有的超类实例初始化子类

    我正在用 python 编写我自己版本的套接字类 我想知道是否有办法not使用它初始化子类 init 方法 而是使用初始化它套接字类的现有实例 基本上 我想做的是从套接字类继承 并覆盖accept 方法返回我自己的类的对象而不是套接字类 为
  • 使用ansible下载大文件

    我想用 ansible 下载一个大文件 10 GB 根据连接情况 这需要半个小时 并且经常因 unarchive 或 get url 失败 如何在出现错误时恢复并取得某种进展 从而理想地实现这一目标 我认为没有任何方法可以在 Ansible
  • “useLegacyV2RuntimeActivationPolicy”在 .NET 4 配置中起什么作用?

    在将使用 SlimDX 因此具有非托管代码 的项目转换为 NET 4 0 时 我遇到了以下错误 混合模式程序集是针对运行时版本 v2 0 50727 构建的 如果没有附加配置信息 则无法在 4 0 运行时中加载 谷歌搜索给了我解决方案 即将
  • SQL 查询具有自定义文件扩展名的平面文件时出错

    我正在寻找一种查询平面文件的方法custom直接通过 SQL 扩展文件 通常使用类似的东西 SELECT FROM Text DATABASE C Flatfiles S7121070 ppis csv 它与 txt csv 和 tab 配
  • 使用 PEG.js 解析缩进级别

    我基本上有同样的问题Python 风格缩进的 PEG https stackoverflow com questions 4205442 peg for python style indentation 但我想得到更多关于这个答案 http