gpt4 book ai didi

parsing - 用于识别行尾空格的上下文无关语法

转载 作者:行者123 更新时间:2023-12-05 01:47:29 24 4
gpt4 key购买 nike

我正在尝试编写一个上下文无关的语法来做一些非常简单的事情——将一个字符串解析成一个交替部分的列表(1)行尾空格和(2)其他所有内容。例如:

This.first.line...\n..and.this....second.line\n.\n..and.final.line

(将 "" 显示为 "." 并将换行显示为 "\n" 以提高可读性)被解析为

"This.first.line", "...\n..", "and.this....second.line", "\n.\n..", "and.final.line"

我写了这个语法:

string = raw_start | newline_start
raw_start = raw_section [newline_start]
newline_start = newline_section [raw_start]
raw_section = {any_character_except_newline}
newline_section = {whitespace_except_newline} new_line {any_whitespace_character}

但这是不正确的,因为 {any_character_except_newline} 将消耗通向换行符的空格,而我希望这些空格包含在 new_line_section 中。

是否可以在不丢失语法的上下文无关属性的情况下说“消耗空格,除非它们正好在换行符之前”?

最佳答案

当然,上下文无关不是问题。 “行尾空格”和“其他所有内容”都是常规语言。

作为引用,这里是正则表达式(正式的正则表达式,而不是“可通过某些‘正则表达式’包识别”)。我们假设 A 是字母表,并定义:

<b>NOTSPACE</b> = { ∀x | x ∈ <b>A</b> ∧ x ≠ <kbd>NL</kbd> ∧ x ≠ <kbd>SPACE</kbd> }
<b>NOTEOL</b> = { ∀x | x ∈ <b>A</b> ∧ x ≠ <kbd>NL</kbd> }
<b>EVERYTHING_ELSE</b> = { xωy | x,y ∈ <b>NOTSPACE</b> ∧ ω ∈ <b>NOTEOL</b><sup>*</sup> } ⋃ <b>NOTSPACE</b>
<b>EOL_WHITESPACE</b> = { ω<kbd>NL</kbd>γ | ω,γ ∈ {<kbd>SPACE</kbd>, <kbd>NL</kbd>}<sup>*</sup> }

可以轻松将其转换为 CFG。 (文本可能以不包含换行符的空格结尾。以下忽略了这种可能性,但可以轻松添加):

S → Spaces
S → S Other
S → S EOL_WS
Spaces → ε
Spaces → Spaces [ ]
Other → [^ \n] Line [^ \n]
Other → [^ \n]
Line → ε
Line → Line [^\n]
EOL_WS → Spaces NL_Spaces
NL_Spaces → NL_Space
NL_Spaces → NL_Spaces NL_Space
NL_Space → [/n] Spaces

正如所写,上面的内容是模棱两可的,因为它没有坚持 OtherEOL_WS 是最长的。这很容易修复但很乏味,而且由于 OP 只要求一个 CFG 而不是一个明确的或 LR(1) CFG,我就这样吧。

关于parsing - 用于识别行尾空格的上下文无关语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25825709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com