给出描述Java表达式的DFA~~~~~~~~~~在线等

JavaScript019

给出描述Java表达式的DFA~~~~~~~~~~在线等,第1张

这是DFA算法,自己设定好值,看下结果

import java.util.*

import java.io.*

class DFA

{

 boolean recognizeString(int move[][], int accept_state[], String word)

 {

  

  int s=0

  for (int i = 0i <word.length()i++)

  {

   char c = word.charAt(i)

   s = move[s][c - 'a']

  }

  for (int j = 0j <accept_state.lengthj++)

   if (s == accept_state[j]) return true

  return false

 }

 public static void main(String args[]) throws IOException

 {

  int n, m

  BufferedReader in = new BufferedReader(new FileReader("DFA.in"))

  StringTokenizer st = new StringTokenizer(in.readLine())

  n = Integer.parseInt(st.nextToken())

  m = Integer.parseInt(st.nextToken())

  while (n != 0)

  {

   int[][] move = new int[n][m]

   for(int i=0i<ni++)

   {

    st = new StringTokenizer(in.readLine())

    for (int j=0j<mj++)

     move[i][j] = Integer.parseInt(st.nextToken())

   }

   String[] temp = in.readLine().split("\\s")

   int[] accept = new int[temp.length]

   for (int i=0i<accept.lengthi++) accept[i] = Integer.parseInt(temp[i])

   String word = in.readLine()

   while (word.compareTo("#") != 0)

   {

    DFA dfa = new DFA()

    if (dfa.recognizeString(move, accept, word)) System.out.println("YES")else System.out.println("NO")

    word = in.readLine()

   }

   st = new StringTokenizer(in.readLine())

   n = Integer.parseInt(st.nextToken())

   m = Integer.parseInt(st.nextToken())

  }

 }

}

下面具体介绍DFA的化简算法:

(1) 首先将DFA M的状态划分出终止状态集K1和非终止状态集K2。

K=K1∪K2

由上述定义知,K1和K2是不等价的。

(2) 对各状态集每次按下面的方法进一步划分,直到不再产生新的划分。

设第i次划分已将状态集划分为k组,即:

K=K1(i)∪K2(i)∪…∪Kk(i)

对于状态集Kj(i)(j=1,2,…,k)中的各个状态逐个检查,设有两个状态Kj’、 Kj’’∈Kj(i),且对于输入符号a,有:

F(Kj',a)=Km

F(Kj'',a)=Kn

如果Km和Kn属于同一个状态集合,则将Kj’和Kj’’放到同一集合中,否则将Kj’和Kj’’分为两个集合。

(3) 重复第(2)步,直到每一个集合不能再划分为止,此时每个状态集合中的状态均是等价的。

(4) 合并等价状态,即在等价状态集中取任意一个状态作为代表,删去其他一切等价状态。

(5) 若有无关状态,则将其删去。

根据以上方法就将确定有限自动机进行了简化,而且简化后的自动机是原自动机的状态最少的自动机。

首先划分终态集和非终态集,之后不断进行划分,直到不再发生变化。

每轮划分对所有子集进行。对一个子集的划分中,若每个输入符号都能把状态转换到等价的状态,则两个状态等价。

划分完成后,从每个子集选出一个代表,若DFA中存在两个子集内状态之间的转换,则MFA中两个子集的代表之间也存在对应的转换。简便方法:对每个子集删去除代表以外的状态,并把指向它们的箭弧改为指向代表。

MFA的初态是含有DFA初态的子集的代表。MFA的终态集是DFA终态集划分出来子集的代表。

最后,从MFA中删除从初态无法到达的状态和死状态(只有入射弧或指向自身的出射弧的非终止状态)。

去除不可达状态。建表,行列为不同状态,未标记的格子行列状态等价。首先标记行列一个非终止状态一个终止状态的格子。对未标记的格子(q,q'),若存在一个输入符号a,使q经a到达状态和q'经a到达状态不等价,则标记(q,q')。重复直到表格不再变化。

对于所有未标记的(q,q'),把与q'有关的转换都改到q上,删除q'。