我正在尝试编写一个上下文无关语法来执行一些非常简单的操作 - 将一个字符串解析为(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'中的最后一个字符是非空白字符。 – drhagen 2014-09-13 22:35:26
@drhagen:很酷。修复了'EOL_WHITESPACE'定义中的错误。实际上,在这个规则中,ω可以简单地称为“SPACE *”,但除非你关心模糊性,否则没有区别。还修复了“Other”中的错误(我没有留下它只是一个非空白字符的可能性)。所有这些都证明了实际测试语法的重要性,在这种情况下我仍然没有这样做: ( – rici 2014-09-14 03:47:40