2010-01-23 22 views
1

我從我需要解析的軟件中獲得(專有)輸出。可悲的是,有一些非用戶名,我正在抓我的頭髮,試圖知道我是否可以用BNF(或EBNF或ABNF)來解析我需要解析的文件。非轉義用戶名與BNF不兼容?

的問題,過於簡單化(這真的只是一個例子),可能是這樣的:

(數據):: = <用戶名>
<用戶名> :: =(其他類型的數據)

而且在某些情況下,用戶名不會出現在左側或右側,而可能出現在一行的中間。

問題是用戶名未轉義,用戶名沒有足夠的限制(它們是可打印的ASCII,最多20個字符,它們不能包含換行符)。例如,「=」將是一個完全有效的用戶名。因此,「= 1 = john = 2」(因爲用戶在登錄時允許選擇他們想要的任何用戶名,並且這些用戶名在我得到的輸出中不會轉義)。

我在問,因爲我的解析器在一些非常有創意的用戶名上發出噓聲(再次,不在我的控制下,他們「很奇怪」,我需要處理它),我無法找到一個簡單的方法來處理這個。另外請注意,我事先並不知道用戶名(例如,我無權訪問包含用戶創建的所有用戶名的數據庫)。

那麼是不受限制和非轉義的用戶名與BNF不相容?

P.S:冷靜與我,如果我犯了錯,這是我的計算器:)的第一篇文章

+0

你怎麼知道用戶名何時結束? – 2010-01-23 14:49:57

+0

@Jason:這就是問題的關鍵。我沒有*定義輸入:可能會出現這種情況,我會使用BNF/tokenizer方法將一個令牌誤認爲用戶名的結尾,反之亦然。Eli和mcdowella回答說:基本上給我任何BNF和能夠選擇我想要的任何用戶名,我可以打破任何標記器。 – SyntaxT3rr0r 2010-01-23 17:42:42

回答

1

BNF沒有「照顧」爲每本身的用戶名。它在令牌級別上工作。如果您定義了一個username令牌,則可以使用基於BNF的語言來構建描述語法。

您的問題應該在詞法分析器級別解決。詞法分析器應該足夠聰明,可以識別用戶名,即使它們沒有被轉義,也可以將username標記傳遞給解析器。

從理論上講,您可以用語法來描述各種用戶名,但這很大程度上取決於您的語言中的其他內容。 =是否是一個有效的標記?如果是這樣,你怎麼能告訴用戶有=?我想你必須用你的語言來描述其餘的規則和有效的標記,以便在這裏得到更完整的答案。

+0

如果在同一行上有其他標記,或者用戶名包含解析器也考慮標記的東西,那麼問題就出現了嗎? – 2010-01-23 12:28:17

+0

@Eli:是的,我的問題沒有很好地表達出來:我們在標記化時遇到了問題。詞法分析器是否能夠足夠聰明地識別用戶名,知道基本上任何用戶名都是有效的?讓我們設想一下,用戶會故意使用會打破詞法分析器的名稱。當用戶對其用戶名沒有任何限制時,總是可以解決這個問題嗎? – SyntaxT3rr0r 2010-01-23 12:30:54

+0

@Paul:是的,這正是我的問題的要點:) – SyntaxT3rr0r 2010-01-23 12:32:10

1

通過識別不是用戶名的東西,然後將其他所有內容聲明爲用戶名,可能是可行的,即使這意味着從右向左解析,而不是從左向右解析或做同樣古怪的事情。

您可能需要查看您的輸入是否真的含糊不清:您是否可以找到導致產生相同輸出的兩種不同情況?如果是這樣,你需要回去並獲得要求他們支持哪些,或者產生什麼樣的錯誤,或者其他什麼。如果不是,那麼爲什麼不能幫助你計算出你的解析器或者詞法分析器或者其他需要做什麼。

+0

@mcdowella:是的,它意味着完全這樣的「古怪」解析。我基本上(甚至在問這裏的問題之前)使用了一個LR解析器,一個RL解析器和一個「從外到內」的解析器(解析左邊的一個char,右邊的一個char,然後走向每一行的中心)我輸入的那種(再次輸入格式不在我的控制之下)。 但我在這裏問了這個問題,以確保我不是「看到的東西」:我放棄了BNF/tokenizer的方法,並且想確保它不是在這種情況下工作。 非常感謝您的回答:) – SyntaxT3rr0r 2010-01-23 17:46:59