我基本上有同样的问题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(使用前将#替换为@)