這聽起來像一個偉大的個人項目。你將學到很多關於編譯器基本部分如何工作的知識。我會跳過嘗試使用解析器生成器;如果這是爲了你自己的教化,你會從頭開始學習更多。
這種系統的工作方式是我們如何理解自然語言的形式化。如果我給你一句話:「狗,羅孚,吃了他的食物」,你做的第一件事就是把它分解成文字和標點符號。 「The」,「SPACE」,「dog」,「COMMA」,「SPACE」,「Rover」......這是「標記化」或「lexing」。
您接下來要做的是分析令牌流以查看句子是否是語法。英語的語法非常複雜,但這句話很簡單。主題同位語謂賓。這是「解析」。
一旦你知道這個句子是語法的,你就可以分析這個句子,以便真正從中得到意義。例如,你可以看到這句話有三個部分 - 主語,同位語和賓語中的「他」 - 都指同一個實體,即狗。你可以發現狗是吃東西的東西,食物就是被吃的東西。這是語義分析階段。
編譯器然後有人類沒有的第四個階段,這是他們生成的代碼,代表在語言中描述的操作。
所以,做到這一點。首先定義你的語言的標記,定義一個基類Token和一組派生類。 (IdentifierToken,OrToken,AndToken,ImpliesToken,RightParenToken ...)。然後編寫一個接受一個字符串並返回一個IEnumerable'的方法。這是你的詞法分析器。
其次,找出你的語言的語法是什麼,並編寫一個遞歸下降解析器,將IEnumerable分解成一個抽象語法樹,它表示語言中的語法實體。
然後寫一個分析工具,着眼於樹和數字的東西出來,像「有多少不同的自由變量做我有嗎?」
然後編寫一個代碼生成器,用於生成評估真值表所需的代碼。隨地吐痰IL似乎過度殺傷,但如果你想成爲真正的愛好者,你可以。讓表達式樹庫爲你做這件事可能會更容易;您可以將您的分析樹轉換爲表達式樹,然後將表達式樹轉換爲委託並評估委託。
祝你好運!
正則表達式由於任意數量的括號而不起作用。你需要使用某種解析器生成器。 – 2009-07-05 21:42:29
我認爲,這些源代碼(http://mrieppel.net/prog/truthtable.html)很有用。 – yv4 2015-04-25 14:43:23