我試圖設計一個算法,它將一個CFG G和一個終端符號a作爲輸入,並且如果S(G的開始規則)可以生成一個開始的句子形式,與。即如果在(T U N)*中有一個串α使得S => *aα,否則它輸出否。例如,如果語法是S - > [S] | SS | ε,如果a =],答案是否定的。我不在尋找代碼,我只是想了解我應該如何在僞代碼中處理這個主題。上下文無關語法的算法
3
A
回答
2
有三種方式X
可以派生一個字符串從a
開始。
- 有形式
X -> a...
- 的規則有形式
X -> A...
的規則和A
派生開始a
的字符串。 X -> B A...
和B
從ε
和A...
派生出一個字符串,從a
開始的規則。
可以使用這些構建算法,着眼於該語法的開始與那些形式S -> ...
的所有規則和適用任一檢查1,如果RHS與終端或兩個檢查2和3,如果它開始從非終端開始。每個檢查對應一個返回布爾值的(可能是遞歸的)函數。
一個有趣的細節是需要處理語法中的循環,例如,單條規則如A -> A a
,還有A -> B...
,B -> C...
,C -> A...
。如果你不小心,相互遞歸檢查將無限重現。我會讓你的。考慮深度優先搜索如何避免圖表中的下一個循環永久。
另一個細節是如何確定給定的非終端B是否派生ε
。你應該能夠自己解決這個問題,但如果其他方法都失敗了,請查找「可空的非終端」。你會發現一個衆所周知的小算法。
如果任何檢查都是肯定的,則返回yes。否則規則的詳盡應用已經找不到辦法。返回no。
2
您可以只運行Earley parser的預測值,直到它停止預測,並查看它是否生成以相關終端開始的任何規則。
或者從下往上開始,將接受問題終端的所有非終結點標記爲第一個輸入,然後將接受已標記爲非終點的所有非終結點標記爲它們的第一個輸入,然後重複直到完成,並查看S在標記的非終結符中。
相關問題
- 1. 上下文無關語法
- 2. 上下文無關文法語法
- 3. 上下文無關語法與上下文敏感語法?
- 4. 從非遞歸上下文無關語法生成有限語言的算法
- 5. 查找上下文無關語法(CFG)
- 6. 「任意」上下文無關語法?
- 7. 上下文無關語法公式
- 8. 上下文無關語法幫助
- 9. 上下文無關語法 - 計算理論
- 10. 上下文無關文法
- 11. 上下文無關文法
- 12. 將EBNF語法轉換爲上下文無關語法
- 13. 正式上下文無關文法從上下文無關語言
- 14. 提供生成以下語言的上下文無關文法
- 15. 爲以下語言編寫上下文無關語法
- 16. 算法從任何正則表達式生成上下文無關語法
- 17. 語言的上下文無關語法的數量多於bs
- 18. 找到更復雜的語言的上下文無關語法的方法
- 19. 導的上下文無關文法
- 20. 特定語言的上下文無關文法
- 21. 非迴文的上下文無關語法
- 22. 爲語言創建上下文無關語法
- 23. 這是什麼語法?上下文無關的或上下文敏感的
- 24. 從上下文無關語法構造下推自動機
- 25. Java中上下文無關語法的語法編輯器工具
- 26. NLTK上下文無關文法
- 27. 構建上下文無關文法
- 28. 歧義上下文無關文法
- 29. 上下文無關文法到序言?
- 30. YACC和上下文無關文法