1

我想畫一個FSM使用發現令牌找到令牌給Microsyntax拉絲有限狀態機(FSM)使用給定的Microsyntax

microsyntax 
// Uses .Net regular expression syntax. 

Identifier <|[a-zA-Z][\w_.]* 

IntegerValue <|\d+ 

// real values must include a decimal point. 
RealValue <|\d*\.\d+ 

// Note that strings do not have any escape characters 
// and will be prematurely terminated with a newline. 
StringValue <|"[^"\n]*" 

我對FSM圖如下所示: enter image description here

我不確定我製作的圖是否完全正確。我在繪製圖中的困惑在於: 1)標識符a-z,A-Z,_的循環轉換。 2)從整數轉換爲realValue:狀態3是否從0-9循環轉換?和 3)過渡到stringValue。

如果有人能讓我知道圖表是否正確,如果不正確,我的錯誤是什麼?

回答

1

除了狀態3不是最終的並且不應該循環以外,這很好。 (另外,我沒有看到你的空格和操作規則,但圖看起來似是而非。)

與狀態3的問題是:

8. 

不匹配或者\d+也不\d*.\d+;前者是因爲.而後者是因爲它堅持在.後至少有一位數字。因此,狀態3是你讀完8.之後的地方,不是最終的。一旦它得到另一個數字,它將進入狀態4(所以沒有循環),這是正確的最終。

我會寫一個循環,而不是兩個狀態1,但我不認爲它有任何區別。另外,狀態6(不是最終)下的語義標籤應該處於狀態7(最終)。 (呵呵,雖然最後顯而易見,但它並不會傷害到開始狀態的標籤。)

HTH。

+0

謝謝你的回答。但是,如果真正的價值是1.5說呢?難道它會停止在第3次循環轉換嗎?由於實際值可以有1.5或1.25以上的一個以上的小數點。如果實際值是1.5,那麼狀態3不是最終的,如果值是1.25,那麼第4個將是最終的? – Sujal

+0

從狀態2到狀態3的轉換是當它讀取一個'.'。你有兩個從狀態3到數字的輸出轉換:不正確的轉換,正確的轉換到狀態4.當它讀取'1.5'中的'5'時,它應該轉到狀態4(接受)。所以它只會在讀完'.'後才處於狀態3,根據你的語法,這不是一個有效的數字。 – rici

+0

謝謝!有道理 – Sujal