相关疑难解决方法(0)

用PEG.js解析缩进级别

我有与Python样式缩进的PEG基本相同的问题,但我想对这个答案有更多的指导.

答案成功生成了一个字符串数组,每行输入行之间有'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 = '}'
Run Code Online (Sandbox Code Playgroud)

使用缩进而不是大括号来描述块,仍然得到相同的输出?

(使用http://pegjs.majda.cz/online来测试语法具有以下输入:a{bcd{zyx{}}})

javascript syntax parsing peg

9
推荐指数
2
解决办法
2421
查看次数

使用PEG解析器进行BBCode解析:pegjs还是......什么?

我有一个bbcode - > html转换器,它响应textarea中的change事件.目前,这是使用一系列正则表达式完成的,并且存在许多病理情况.我一直想在这个语法上磨铅笔,但不想进入牦牛剃须.但是......最近我开始意识到pegjs,这似乎是PEG解析器生成的一个非常完整的实现.我已经指定了大部分语法,但现在我想知道这是否适合使用完整的解析器.

我的具体问题是:

  1. 由于我的应用程序依赖于将我能够转换为HTML并将其余内容保留为原始文本,因此使用可能在语法错误上失败的解析器实现bbcode是否有意义?例如:[url=/foo/bar]click me![/url]一旦输入关闭标记上的结束括号,肯定会成功.但是在此期间用户会看到什么?使用正则表达式,我可以忽略不匹配的东西,并将其视为普通文本以用于预览目的.使用正式语法,我不知道这是否可行,因为我依赖于从解析树创建HTML以及解析失败的原因是什么?

  2. 我不清楚应该在哪里进行转换.在正式的基于lex/yacc的解析器中,我将有头文件和符号表示节点类型.在pegjs中,我得到了带有节点文本的嵌套数组.我可以将翻译后的代码作为pegjs生成的解析器的一个动作发出,但是它似乎是一种将解析器和发射器组合在一起的代码气味.但是,如果我打电话PEG.parse.parse(),我会收到这样的话:

[
       [
          "[",
          "img",
          "",
          [
             "/",
             "f",
             "o",
             "o",
             "/",
             "b",
             "a",
             "r"
          ],
          "",
          "]"
       ],
       [
          "[/",
          "img",
          "]"
       ]
    ]
Run Code Online (Sandbox Code Playgroud)

给出如下语法:

document
   = (open_tag / close_tag / new_line / text)*

open_tag
   = ("[" tag_name "="? tag_data? tag_attributes? "]")


close_tag
   = ("[/" tag_name "]") 

text
   = non_tag+

non_tag
   = [\n\[\]]

new_line
   = ("\r\n" / "\n")
Run Code Online (Sandbox Code Playgroud)

当然,我正在缩写语法,但你明白了.所以,如果你注意到,数组数组中没有上下文信息告诉我我有什么样的节点,即使解析器已经完成了这个,我还是要再次进行字符串比较.我希望在解析期间可以定义回调并使用操作来运行它们,但是网上很少有关于如何做到这一点的信息.

我吠叫错了树吗?我应该回到正则表达式扫描并忘记解析吗?

谢谢

javascript parsing bbcode peg pegjs

6
推荐指数
1
解决办法
1247
查看次数

标签 统计

javascript ×2

parsing ×2

peg ×2

bbcode ×1

pegjs ×1

syntax ×1