我有与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{}}})
我有一个bbcode - > html转换器,它响应textarea中的change事件.目前,这是使用一系列正则表达式完成的,并且存在许多病理情况.我一直想在这个语法上磨铅笔,但不想进入牦牛剃须.但是......最近我开始意识到pegjs,这似乎是PEG解析器生成的一个非常完整的实现.我已经指定了大部分语法,但现在我想知道这是否适合使用完整的解析器.
我的具体问题是:
由于我的应用程序依赖于将我能够转换为HTML并将其余内容保留为原始文本,因此使用可能在语法错误上失败的解析器实现bbcode是否有意义?例如:[url=/foo/bar]click me![/url]一旦输入关闭标记上的结束括号,肯定会成功.但是在此期间用户会看到什么?使用正则表达式,我可以忽略不匹配的东西,并将其视为普通文本以用于预览目的.使用正式语法,我不知道这是否可行,因为我依赖于从解析树创建HTML以及解析失败的原因是什么?
我不清楚应该在哪里进行转换.在正式的基于lex/yacc的解析器中,我将有头文件和符号表示节点类型.在pegjs中,我得到了带有节点文本的嵌套数组.我可以将翻译后的代码作为pegjs生成的解析器的一个动作发出,但是它似乎是一种将解析器和发射器组合在一起的代码气味.但是,如果我打电话PEG.parse.parse(),我会收到这样的话:
Run Code Online (Sandbox Code Playgroud)[
[
"[",
"img",
"",
[
"/",
"f",
"o",
"o",
"/",
"b",
"a",
"r"
],
"",
"]"
],
[
"[/",
"img",
"]"
]
]
给出如下语法:
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)
当然,我正在缩写语法,但你明白了.所以,如果你注意到,数组数组中没有上下文信息告诉我我有什么样的节点,即使解析器已经完成了这个,我还是要再次进行字符串比较.我希望在解析期间可以定义回调并使用操作来运行它们,但是网上很少有关于如何做到这一点的信息.
我吠叫错了树吗?我应该回到正则表达式扫描并忘记解析吗?
谢谢