2015-03-31 29 views
1

首先,我不學習計算機科學,我只是對這個問題感興趣。試圖瞭解解析和掃描(差異語言和cf語言)

解析器基本上這是否正確:

  1. 讀取輸入
  2. 創建令牌
  3. 實際上解析令牌並創建一個AST

因此,我認爲,爲了決定是否一個單詞是一種常規的語言,你使用一個FSM和CF語言,你需要一個解析器,因爲可能存在遞歸結構。因此,存在用於常規語言的掃描器生成器和用於CF語言的解析器生成器。

但現在我看,你可以建立一個遞歸體面解析器的正則表達式:

http://matt.might.net/articles/parsing-regex-with-recursive-descent/

那麼,這怎樣都去togther?

爲什麼我需要解析常規語言?我認爲一個有限狀態機就足夠了?

如果例如我想在java程序中識別塊註釋(即/* .. */),我只需要編寫一個FSM,所以基本上就是一個switch-case語句。我不需要爲此解析器...

感謝您的幫助和澄清!

回答

1

正則表達式能匹配什麼和解析正則表達式需要什麼不同。例如,正則表達式可以包含嵌套組,因此不能使用正則表達式解析這些組。例如,您必須「計數」嵌套的括號對,這在正常語言的能力範圍之外。

另見:Is there a regular language to represent regular expressions

+0

啊......所以正則表達式本身不是正規語言,只有它們匹配的是?因此,爲了檢查,是否使用常規語言,您使用FSM,但正則表達式本身必須被解析?但仍然:我只需要一個CF語言的解析器?對於RL,FSM就足夠了? – user3629892 2015-03-31 15:27:13

+0

什麼是「解析器」?例如,C函數'scanf()'用於將字符串表示解析爲不同的基本數據類型,如數字或字符串。 JavaScript有一個'parseInt()'函數來將字符串解析成數字。兩者都不需要比類似FSM的實現來解析輸入。是的,爲了解析RL,FSM就足夠了。 – BlackJack 2015-03-31 15:49:19

+0

嗯好吧..我認爲一個「語法分析器」意味着有一個語法樹......而在parseInt的情況下,例如它被稱爲掃描器...... – user3629892 2015-04-08 14:24:38