Python: Analizador de la función VOID MAIN de C++

Descripción

Analizador Léxico y Sintáctico de una función void main() de C++ hecho en python, que analiza dicha función, con declaración de variables y asignación de valores enteros.

Lee los datos de un archivo llamado gram.

La lectura del archivo se hace linea por linea, extrayendo los datos para luego separarlos en tokens y realizar el análisis sintáctico de acuerdo a la gramática.

Gramática en Notación BNF

<function_main> ::= void main ( ) { <sentence> }

<sentence> ::= <declaration> | <assig>

<declaration> ::= <type_data> <dec_a>;

<dec_a> ::= <identifier> | , <identifier> <dec_a>

<assig> ::= <identifier> = <expr> ;

<expr> ::= <expr> <operator> <expr> | <indentifier> | <const_int>

<indentifier> ::= <letter> <ide_a>

<ide_a> ::= <digit> <ide_a> | <letter> <ide_a>

<const_int> ::= <digit> | <digit> <const_int>

<type_data> ::= int

<letter> ::= <letter_l> | <letter_u>

<letter_u> ::= A | ... | Z

<letter_l> ::= a | ... | z

<digit> ::= 0 | ... | 9

<operator> ::= + | - | * | /

Tokens: Declaración mediante tuplas

(TYPE_FUNCTION, NAME_FUNCTION) = ('void', 'main')

(PAREN_BEGIN, PAREN_END) = ('(', ')')

(BRACK_BEGIN, BRACK_END) = ('{', '}')
(COM, SEMICOLON) = (',', ';')
(OP_ASSIG) = ('=')

DIGIT = tuple([str(i) for i in range(10)])

OPERATOR_B = ('+', '-', '*', '/')

TYPE_DATA = ('int', 'float')
#

Algunas funciones de análisis de tokens

def isLetter(x): #letra
def isDigit(x): #digito
def isOperator(x) #operador
def isTypeData(x): #tipo de dato
def isIdentifier(x): #identificador

-> 1) Fichero de entrada gram

void main ( )

{

int a, b, B; int f;

a = 12 + B;

int x;

x = b + 25 * 12;

f = a * x;

}

-> 2) Salida de programa

void: Tipo void

main: Funcion principal

(: Parentesis inicio

): Parentesis final

{: Corchete inicio

...

}: Corchete final

---- Parsing correcto ----

-- 1) Entrada incorrecta

Por ejemplo si cambiamos en fichero gram la linea a = 12 + B; por a = 12 + var;

-- 2) Salida de análisis incorrecto

void: Tipo void

...

+: Operador mas

Stop --> Line[5] var: no definido

Stop --> Line[5]


Código Fuente Completo

Comentarios

  1. Hola me gustaria saber si por ahi tienes codigo del analizador lexico y sintactico de python(del leguaje python....!!!).
    pd:
    Gracias!

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Qt/OpenGL - NetBeans: Ejemplo de Transformaciones

PyQt: Ejemplo de Base de Datos

Qt 3D: Animación de un cubo