我正在尝试编写一个无上下文语法,以实现一个非常简单的功能——将字符串解析为交替出现的(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
一起被包括进去。
有没有可能说“消耗空格,除非它们紧挨着换行符”而不失去语法的上下文无关性?
EVERYTHING_ELSE = { xωy | x,y ∈ NOTSPACE ∧ ω ∈ NOTEOL* }
,并且认识到我必须要求raw_section
中的最后一个字符是非空格字符。 - drhagenEOL_WHITESPACE
定义中的错误。实际上,在那个规则中,ω可以简单地是SPACE*
,但除非你关心歧义,否则没有区别。还修复了Other
中的错误(我没有考虑它只是一个单独的非空格字符的可能性)。所有这些都证明了实际测试语法的重要性,在这种情况下我仍然没有做到:( - rici