簡體   English   中英

如何識別語法是否為LR(n),LL(n)

[英]How to identify whether a grammar is LR(n), LL(n)

對於不是LL(1)LR(1)的語言,如何嘗試找出某個數字n存在,使得語法可以是LL(n)LR(n)

您檢查是否有語法是LR(0)通過查看的規范集合LR(0)項目。 然后,假設它不是LR(0) ,則可以通過引入前瞻符號來檢查它是否為LR(1) 我的簡單推理告訴我,要檢查它是否為LR(2) ,可能必須使前行包含接下來的兩個符號而不是僅一個。 對於LR(3)您必須考慮三個符號等。

即使是這種情況,盡管我對此表示懷疑,但我仍在努力思考如何才能嘗試識別(甚至暗示) nn的不存在,為此可以使用一種特定的語法LR(n)和/或LL(n)無需從任意LR(m)向上逐步檢查。

  1. 如果某語言的 k > 1是LR( k ),則它是LR(1)。 (當然,對於語法不是正確的。)也就是說,如果您對一種語言具有LR( k )語法,則可以機械地構造LR(1)語法,以使您可以恢復原始的語法分析樹。 LL( k )並非如此; LL( k )語言是LL( k +1)語言的嚴格子集。

  2. 您提出的測試確實可以讓您確定某個給定的k(或LL( k ))的語法是否為LR( k )。 不幸的是,除了您建議的連續搜索之外,沒有其他方法可以找出k的最小可能值,並且無法保證搜索將永遠終止。

  3. 盡管在一般情況下該問題很難解決(或不可能解決),但通常可以通過考慮表現出沖突的語法狀態的可能有效后繼者來解決特定的語法問題。

在大多數現實世界語法中,只有少數沖突,因此可以手動檢查沖突狀態。 一般而言,需要弄清楚導致沖突狀態的路徑以及可能的延續。 在許多情況下,很明顯,可以稍微提前一點解決解析沖突。

這將失敗的一大類語法是模棱兩可的語法集。 對於任何k而言,歧義語法都不能為LR(k)(或LL(k))。 同樣,語法是否模棱兩可的問題尚不確定,但存在有效的啟發式方法,其中一些啟發式方法包含在商業產品中。

同樣,通過目視檢查(如上)或通過將大量有效文本輸入到GLR解析器(如bison生成的文本)中,直到發現歧義,通常很容易在現實語法中發現歧義。 。 (或者,您可以使用簡單算法從語法中枚舉有效文本,並查看文本是否在枚舉中出現兩次。)

這是說明分析技術的幾個可能相關的SO問題。 我敢肯定還有更多。

明確語法上的yacc移位/減少沖突

野牛減少/減少情況

yacc shift-reduce用於歧義lambda語法

如何理解和解決PLY中的沖突

暫無
暫無

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

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