2014-04-17 149 views
1

我需要爲給定的語法編寫詞法分析器和解析器(我需要手工製作它,而不是使用生成器)。我做了很多研究,但我仍然無法弄清楚如何編寫代碼。來自EBNF的C++中的詞法分析器和解析器

比如我(在EBNF語法):

<Letter> ::= [A-Za-z] 

<IntegerLiteral> ::=<Digit> { <Digit> } 

是否在詞法分析器或解析器來定義這種需求?如何?

我知道詞法分析器應該按字符和輸出標記讀取文件字符,然後將這些標記傳遞給解析器來創建解析樹,但是我陷入了編碼中。

+0

「我需要不用發電機手工製作」:這是否會阻止你使用助推精神? (www.boost.org)。 – Bathsheba

+0

它是一個發電機? – user3505334

+0

_'is它是一個生成器嗎?'_不是說需要使用C++編譯器以外的其他東西。 –

回答

2

你告訴我們看起來像它定義了令牌類型。所以它在詞法分析器中。

寫一個詞法分析器的訣竅就是簡單地把你的輸入文本(這是一個很長的單個字符流)並逐個查看它們。每當你看一個角色時,根據上面的EBNF對它進行分類(即它是一個Letter還是一個IntegerLiteral),然後生成相應的令牌。

現在你上面的語法聽起來像是一個毫無意義的語法(它會生成單字符和一位數字的標記)所以我的猜測是你有更多像這樣的規則使用這些規則來使定義更具可讀性。因此實施那些更復雜的規則。編寫一個函數來檢測一個字符是否符合其中一個子規則。

每當您發現當前字符與前一個字符的類型不匹配時,請完成當前字符並開始新字符。

這幾乎都是它的一切。你只需要一堆布爾值來跟蹤類型。

+0

有沒有一個網站可以說明如何做到這一點?爲什麼布爾人要跟蹤類型?答:是的,我確實有更復雜的規則,我只寫了2個簡單的規則。另外,如何將角色分類到上述EBNF? – user3505334

+0

因爲布爾類型是用來記住開啓或關閉的東西的最簡單類型(也就是說我可能是一個整數或雙精度的東西,我是一個整數,但剛剛遇到一個週期,所以它現在只能是一個小數等)。你也可以把它作爲一個成熟的狀態機來實現,但是每當我提到「狀態機」這個詞的時候,人們就會害怕,所以我想我會把它解釋掉。 – uliwitness

相關問題