[英]Algorithm that checks if a context free grammar generates infinite language that a DFA rejects
[英]Algorithm for a Context Free Grammar
我正在嘗試設計一種算法,它將CFG G和終端符號a作為輸入,如果S(G的起始規則)可以生成以aie開頭的句子形式,如果有一個字符串α,則輸出yes在(TUN)*中,S => *aα,否則輸出no。 例如,如果語法是S - > [S] | SS | ε,如果a =],答案是否定的。 我不是在尋找代碼,我只是想了解如何在偽代碼中處理這個主題。
您可以只運行Earley解析器的預測器,直到它停止預測,並查看它是否生成任何以相關終端開始的規則。
或者從下往上開始,將接受有問題的終端的所有非終端標記為第一個輸入,然后將接受已標記的非終結符號的所有非終結符號標記為第一個輸入,並重復直到完成,並查看S是否在集合中標記的非終結者。
有三種方法X
可以得出開頭的字符串a
。
X -> a...
形式的規則X -> a...
X -> A...
形式的規則, A
派生一個以a
開頭的字符串。 X -> B A...
形式的規則, B
導出ε
和A...
派生一個以a
開頭的字符串。 您可以使用這些來構建一個算法,該算法查看語法的所有規則,從S -> ...
開始,如果rhs以終端開頭,則應用check 1,如果它開始,則應用check 2和3。與非終端。 每個檢查對應一個返回布爾值的(可能是遞歸的)函數。
一個有趣的細節是需要處理語法中的循環,例如單個規則,如A -> A a
,還有A -> B...
, B -> C...
, C -> A...
如果你不小心,相互遞歸檢查將無限重復。 我會告訴你的。 想想深度優先搜索如何永遠避免圖中的循環。
另一個細節是如何確定給定的非終端B是否導出ε
。 你應該能夠自己解決這個問題,但是如果一切都失敗了,那么請查看“可以為空的非終端”。 你會發現一個眾所周知的小算法。
如果任何檢查結果為肯定,則返回yes。 其他詳盡無遺的規則已經找不到辦法。 返回號碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.