簡體   English   中英

上下文無關的語法來識別行尾空格

[英]Context-free grammar to recognize end-of-line whitespace

我正在嘗試編寫無上下文語法來做一些非常簡單的事情-將字符串解析為(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}

但這是不正確的,因為當我希望new_line_section包含空格時, {any_character_except_newline}會占用導致換行的new_line_section

是否可以說“使用空格,除非它們在換行符之前”而不丟失語法的上下文無關屬性?

當然,上下文無關不是問題。 “行末空白”和“其他所有”都是常規語言。

作為參考,這里是正則表達式(正式的正則表達式,不是“可通過某些'regex'包識別的”表達式)。 我們假設A是字母,並定義:

NOTSPACE = { ∀x | x ∈ A ∧ x ≠ NL ∧ x ≠ SPACE }
NOTEOL   = { ∀x | x ∈ A ∧ x ≠ NL }
EVERYTHING_ELSE = { xωy | x,y ∈ NOTSPACE ∧ ω ∈ NOTEOL* } ⋃ NOTSPACE
EOL_WHITESPACE = { ωNLγ | ω,γ ∈ {SPACE, NL}* }

可以很容易地將其轉換為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,因此我將其保留。

這是rici很好的答案的翻譯成我在問題中使用的EBNF格式:

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

關鍵是更改raw_section的定義,以要求它以非raw_section字符結尾。 這個簡單的語法不會匹配空字符串或以空格結尾的字符串,但是很容易解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM