詞法分析 NFA語言識別

2021-07-23 16:40:31 字數 2433 閱讀 3848

對於給出的nfa和輸入的字串,判斷字串是否是nfa識別的語言。

輸入有多組資料。每組資料的第一行是兩個整數n(n<=50)和m(m<=27),表示nfa有n個狀態,以及字母表有m-1個字元。

nfa的n個狀態用整數0~n-1表示,狀態0為起始狀態。字母表包含小寫英文本母的前m-1個字元。

接下來的n行,每行有m個整數集(用』』括起)。其中,第i行第1列的整數集表示在狀態i-1時,對應於є(空串)的狀態遷移;

第i行第j(j>1)列的整數集,表示nfa在狀態i-1,當輸入符號為第j-1個小寫字母時,遷移到的狀態集。

接下來的一行包含若干個整數,代表nfa的接受狀態,這一行以-1結尾。

接下來的每一行是乙個待識別的字串,字串的長度在1到50之間且只含有小寫字母。字串」#」代表本組資料結束。

n=m=0表示輸入結束。

對於每個待識別的字串,如果能被給出的nfa識別,輸出yes;否則輸出no

nfa匹配和dfa的匹配思路相似。對於每個輸入的字串,找到其最後可能出現的狀態,然後再判斷最後的狀態中是否存在接受狀態

nfa和dfa的最主區別在於,對於dfa來說,在當前狀態接受到某個字母後能到達的狀態是唯一且確定的

但是對於nfa來說,對每個狀態,當輸入乙個字母的時候,nfa能夠達到的狀態的個數時不確定的,即不確定性有限狀態機的特性。

因此,在處理nfa的輸入字元時,對於每個狀態,讀取乙個字元後,需要確定出所有狀態,因此,需要乙個陣列來記錄所有能夠到達的狀態

值得注意的是,由於nfa允許存在空字串,所以,在對開始狀態進行讀取乙個字母的時候,需要先找到開始狀態經過空字串所能達到的所有狀態作為其真正的開始狀態。

而在每次讀入乙個字元,找到其nfa可能到達的狀態後,還需要找到所有到達狀態經過空字串能夠到達的狀態作為真正的到達狀態

以下圖為例

起始的狀態集合應該是,而對於狀態「2」,當接收乙個』a』時,它能夠到達的狀態應該是,其中,狀態1和7是經過空串到達的。因此,需要特別注意,處理完讀入字元後的直接到達狀態後,還需要找到所有間接到達狀態(直接到達狀態經過乙個或多個空串能夠到達的狀態)

#include 

#include

#include

using

namespace

std;

void getinput(int n, int m);

void print(int n, int m);

int trans[50][27][51]; // 轉換函式,第三維的第一位用來記錄接受狀態的個數

int main()

// 讀入n和m

// 判斷n和m的值是否為0 直到為0時結束

while ((cin >> n >> m) && n != 0 && m != 0)

// 開始匹配輸入的字串

while (1)

// 如果沒有查詢過,則加入佇列

if (hasbeentrans == false)

}// 查詢讀入當前字元能到達的狀態

for (int k = 0; k < trans[finall_state[j]][input[i]-96][0]; k++)

if (hasbeenfind == false) }}

// 將當前狀態賦值給finall_state

for (int x = 0; x < next_state_num; x++)

finall_state_num = next_state_num;

next_state_num = 0;

}// 最後狀態再走一次空串

for (int j = 0; j < finall_state_num; j++)

// 如果沒有查詢過,則加入佇列

if (hasbeentrans == false) }}

// 判斷該狀態是否為接受狀態

for (int i = 0; i < accept_num; i++) }}

if (beaccepted == true) else }}

return0;}

void getinput(int n, int m) else

} else }}

trans[i][j][0] = index-1;}}

}void print(int n, int m)

cout

<< endl;

}cout

<< endl;}}

NFA識別語言

對於給出的nfa和輸入的字串,判斷字串是否是nfa識別的語言。輸入有多組資料。每組資料的第一行是兩個整數n n 50 和m m 27 表示nfa有n個狀態,以及字母表有m 1個字元。nfa的n個狀態用整數0 n 1表示,狀態0為起始狀態。字母表包含小寫英文本母的前m 1個字元。接下來的n行,每行有m...

Redy詞法識別 綜合識別

這一章的內容有 這一章大家會看到乙個完整的大的狀態機,用於識別redy語言中的所有詞文。在前面我們基本上講完了redy中大部份詞文,其中有變數,字串,注釋,整數,長整數,浮點數,運算子。但還有一小部份詞文在前面還沒有提到過,分別為 關鍵字 如if,else,while,for等 語句分隔符 符號 和...

c語言 詞法分析

參考 c陷阱與缺陷 一 c語言對符號的分析方法歸納為乙個很簡單的規則 每乙個符號應該包含盡可能多的字元,也就是說,編譯器將程式分解成符號的方法時,從左到右乙個字元乙個字元地讀入,如果該字元可能組成乙個符號,那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成部分 如果可能,...