Autómata finito determinista para reconocer constantes numéricas
En este breve artículo voy a explicar el proceso de creación de un sencillo autómata finito determinista para reconocer constantes numéricas. Este autómata forma parte del analizador léxico que estoy implementando para el lenguaje de script, que utilizaré en el motor de aventuras gráficas que estoy desarrollando.
Al final del artículo incluiré el código del autómata en su totalidad.
Lo primero que debemos hacer es definir lo que será una constante numérica valida. Una constante numérica debe estar formada por al menos un dígito, puede ir precedida o no por el signo y puede tener o no decimales. Si contiene el punto decimal debe tener al menos un dígito en la parte de los decimales.
Se trata de un autómata conexo ya que todos los estados son accesibles desde el inicial. Es un autómata determinista, ya que desde un estado y para una determinada entrada solo existe transición a un estado, nunca a varios estados.
Una vez definida la constante numérica formalmente mediante el diagrama de estados anterior, la implementación del autómata es muy sencilla. Debemos definir cuales serán los estados finales (aquellos marcados con un doble circulo en la imagen) y que transiciones son válidas para cada estado según las entradas que reciba y cuales no. Una vez procesados todos los caracteres que forman la palabra, la habremos reconocido como una constante numérica correcta, si no se ha producido ninguna transición no válida y si estamos en uno de los estados finales.
-
Option Explicit On
-
Option Strict On
-
-
''' <summary>
-
''' Autómata finito determinista que reconoce constantes numéricas. Pueden tener signo inicial y contener
-
''' el punto decimal o no. Si tiene el punto decimal debe tener al menos un digito despues. El 012 se
-
''' considera correcto
-
''' </summary>
-
''' <remarks></remarks>
-
Public Class AFDCteNumerica
-
Private Const ESTADO_FINAL_1 As Integer = 2
-
Private Const ESTADO_FINAL_2 As Integer = 4
-
-
Public Shared Function Reconocer(ByVal p As String) As Boolean
-
Dim estado As Integer
-
Dim correcto As Boolean
-
Dim i As Integer
-
Dim c As Char
-
-
estado = 0 'estado inicial
-
i = 0
-
correcto = True
-
'recorremos todos los carácteres de la palabra
-
While correcto And i <p.Length
-
c = p.Chars(i)
-
-
If Char.IsDigit(c) Then
-
Select Case estado
-
Case 0
-
estado = 2
-
Case 1
-
estado = 2
-
Case 2
-
estado = 2
-
Case 3
-
estado = 4
-
Case 4
-
estado = 4
-
End Select
-
ElseIf c = "."c Then
-
Select Case estado
-
Case 0
-
correcto = False
-
Case 1
-
correcto = False
-
Case 2
-
estado = 3
-
Case 3
-
correcto = False
-
Case 4
-
correcto = False
-
End Select
-
ElseIf c = "+"c Or c = "-"c Then
-
Select Case estado
-
Case 0
-
estado = 1
-
Case 1
-
correcto = False
-
Case 2
-
correcto = False
-
Case 3
-
correcto = False
-
Case 4
-
correcto = False
-
End Select
-
Else
-
correcto = False
-
End If
-
-
i = i + 1
-
End While
-
-
Return correcto And (estado = ESTADO_FINAL_1 Or estado = ESTADO_FINAL_2)
-
End Function
-
-
End Class
Agosto 22nd, 2006 at 23:06
El artículo está muy bien, sobre todo para refrescar la memoria de algunos sobre autómatas, compiladores, etc. Por cierto, hubiera estado bien también poner en notación BNF las constantes numéricas, hay páginas por ahí que parece que le mola a la gente esta representación. Un saludete y ánimo con el lenguaje de script y con el motor.
Agosto 22nd, 2006 at 23:34
Gracias Sueco.
Lo de la notación BNF estoy haciéndolo ahora mismo para el analizador sintáctico. Supongo que en un próximo artículo lo publicare.
Un saludo
Octubre 17th, 2007 at 2:55
como se podria con un lexico de las figuras geometricas o con alfanumericos
Octubre 18th, 2007 at 11:59
No entiendo muy bien a que te refieres con lo de las figuras geométricas.
En cuanto a las constantes alfanuméricas sería bastante sencillo y similar a lo que se comenta en este post. Lo primero sería definir el diagrama de estado del autómata que reconocerá la constante alfanumérica de forma similar al mostrado en la imagen que hay al inicio del post y a partir de eso crear una máquina de estados como la creada en el post.