gpt4 book ai didi

javascript - 解析 Peg.JS 中的段落

转载 作者:行者123 更新时间:2023-11-28 17:54:46 24 4
gpt4 key购买 nike

我正在尝试学习 peg.js 并想要解析简单的文本“ block ”,但正在努力解决如何对连续行进行分组而不从我的语法中得到“可能的无限循环”错误。

目标:

line 1

line 3
line 4

line 6

解析后会变成:

{
"type": "root",
"children": [
{ type: "para", content: "line 1" },
{ type: "para", content: "line 3\nline 4" },
{ type: "para", content: "line 6" },
]
}

换句话说:

  • 第一行是一个单独的段落,因为它后面有一个空行
  • 第三行和第四行是一个段落,因为它们后面有一个空行
  • 第六行是一个段落,因为它是最后一行(或多行)

我可以编写一个匹配行和空行的语法(请参阅 http://peg.arcanis.fr/4f4NdP/ ),但是我所做的任何尝试将多个连续行后跟空行(或 EOF)变成一个段落都会导致递归错误。我觉得这是一个非常简单的东西,我只是错过了,因为我以前没有使用过 PEG。

我知道我可以在初始化 block 中编写一个全局函数并跟踪最后一个元素并使其与上下文相关,但我觉得这并没有真正使用我应该使用的语法。

最佳答案

你知道那些几周,你在某件事上挣扎了一天左右,然后最终放弃,放下你的骄傲,在 stackoverflow 上发布一个问题......然后十分钟后找出答案?是的!这就是我的一周。我认为写出问题的过程会让你以不同的方式思考问题,你的突触会再次开始放电或者其他什么......

无论如何,解决方案如下:http://peg.arcanis.fr/4f4NdP/2/

给后代的语法:

start = head:Para tail:(newline Para)*
{
var t;

t = tail.reduce(function(memo, element) {
return memo.concat(element[1]);
}, []);

return {
type: 'root',
children: [ head ].concat(t),
}
}

Para = text:LineOfText+
{ return { type: 'para', content: text.join('\n') } }

LineOfText = text:$(char+) EOL
{ return text }

char = [^\n\r]
newline = '\n' / '\r' '\n'?
EOL = newline / !.

输入:

line 1

line 3
line 4

line 6

输出:

{
"type": "root",
"children": [
{
"type": "para",
"content": "line 1"
},
{
"type": "para",
"content": "line 3
line 4"
},
{
"type": "para",
"content": "line 6"
}
]
}

关于javascript - 解析 Peg.JS 中的段落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44722825/

24 4 0
文章推荐: html - flex 网格魔法 (CSS)
文章推荐: css - PyQt - 从图像设置 QLineEdit 背景时出错
文章推荐: html - 让
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com