[英]Recursive descent parsing for boolean grammar
我試圖通過示例學習編譯器和遞歸下降解析。 這不是家庭作業。 我嘗試查看其他一些答案,但是難以理解它們。
我使用的示例是布爾表達式解析器,該表達式返回表達式有效和無效的區域。
有效語法為空格,括號,AND,OR和小寫字母。 小寫單詞需要由布爾運算符(即,貓和老鼠)分隔。
有關其工作方式的一些示例:
"cat AND mouse" = "cat <v>AND</v> mouse"
"cat AND mouse OR" = "cat <v>AND</v> mouse <i>OR</i>"
"pet OR ((domestic AND cat)" = "pet <v>OR</v> <i>(</i><v>(</v>domestic <v>AND</v> cat <v>)</v>"
"cat food" = "cat <i>?</i> food"
如您所見,我要輸出的是每個括號和布爾運算符是否有效,方法是用“ v”標記表示有效或用“ i”標記無效。
我相信該語言的語法如下所示(如果我輸入錯了,請糾正我):
Expression -> 1 or more clauses
Clause -> lowercase_term | (lowercase_term bool_op lowercase_term)
Lowercase_Term -> 1 or more letters from [a-z]
Bool_Op -> AND | OR
但是,我不太確定如何從中進行遞歸下降解析器。 我假設它需要是某種樹,但不確定。
作為參考,我使用Java進行此操作,但是非常感謝偽代碼或任何能幫助我理解這一點的語言代碼!
看看如何構建布爾表達式評估器-使用遞歸下降解析器和解釋器模式 。 這看起來非常像您要的東西。
關於檢測輸入的“有效”部分與“無效”部分:一種簡單的方法是:首先嘗試解析完整的文本。 如果可行,則全文有效。 否則,將文本解析為倒數第二個字符等,直到最終找到有效的輸入前綴。 然后,后面的所有文本均為“無效”。
在這里您可以閱讀並嘗試使用示例,我在那里解釋了如何使用遞歸下降解析技術來解析和解釋算術表達式:
https://leanpub.com/pic/read#leanpub-auto-chapter-2---parsing-and-calculating-expressions
遞歸下降解析是-最直觀的解析技術。 編寫您自己的手工編碼解釋器已經足夠了,不僅可以使用算術表達式,還可以使用循環,if-else語句等。
這是我使用遞歸下降解析技術編寫的手寫玩具解釋器:
https://github.com/mehmetcoskun/contra
它是開源的,您可以下載和調整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.