Un compilador es un software de sistema que traduce el programa fuente escrito en un lenguaje de alto nivel a un lenguaje de bajo nivel. El proceso de compilación del código fuente se divide en varias fases para facilitar el proceso de desarrollo y diseño. Las fases funcionan en secuencia a medida que la salida de la fase anterior se utiliza en la siguiente fase. Las distintas fases son las siguientes:
- Análisis léxico
- Análisis de sintaxis
- Análisis Semántico
- Generación de código intermedio
- Optimización de código
- Asignación de almacenamiento
- Codigo de GENERACION
Fase de análisis léxico: en esta fase, la entrada es el programa fuente que se leerá de izquierda a derecha y la salida que obtenemos es una secuencia de tokens que serán analizados por la siguiente fase de análisis de sintaxis. Durante el escaneo del código fuente, se eliminan los espacios en blanco, los comentarios, los retornos de carro, las directivas del preprocesador, las macros, los saltos de línea, los espacios en blanco, las tabulaciones, etc. El analizador léxico o escáner también ayuda en la detección de errores . Por ejemplo, si el código fuente contiene constantes inválidas, la ortografía incorrecta de palabras clave, etc., se soluciona en la fase de análisis léxico. Las expresiones regulares se utilizan como notación estándar para especificar tokens de un lenguaje de programación.
Simbólico
Básicamente es una secuencia de caracteres que se tratan como una unidad, ya que no se puede desglosar más. En lenguajes de programación como el lenguaje C: palabras clave (int, char, float, const, goto, continue, etc.) identificadores (nombres definidos por el usuario), operadores (+, -, *, /), delimitadores/puntuadores como coma (, ), punto y coma (;), llaves ({ }), etc., las strings se pueden considerar como tokens. Esta fase reconoce tres tipos de tokens: símbolos de terminal (TRM): palabras clave y operadores, literales (LIT) e identificadores (IDN).
Entendamos ahora cómo calcular tokens en un código fuente (lenguaje C):
Ejemplo 1:
int a = 10; //Input Source code Tokens int (keyword), a(identifier), =(operator), 10(constant) and ;(punctuation-semicolon)
Respuesta – Número total de fichas = 5
Ejemplo 2:
int main() { // printf() sends the string inside quotation to // the standard output (the display) printf("Welcome to GeeksforGeeks!"); return 0; } Tokens 'int', 'main', '(', ')', '{', 'printf', '(', ' "Welcome to GeeksforGeeks!" ', ')', ';', 'return', '0', ';', '}'
Respuesta – Número total de fichas = 14
lexema
Es una secuencia de caracteres en el código fuente que coinciden con reglas de lenguaje predefinidas dadas para que cada lexema se especifique como un token válido.
Ejemplo:
main is lexeme of type identifier(token) (,),{,} are lexemes of type punctuation(token)
Patrón
Especifica un conjunto de reglas que sigue un escáner para crear un token.
Ejemplo de lenguaje de programación (C, C++):
Para que una palabra clave se identifique como un token válido, el patrón es la secuencia de caracteres que forman la palabra clave.
Para que el identificador se identifique como un token válido, el patrón son las reglas predefinidas que deben comenzar con el alfabeto, seguido del alfabeto o un dígito.
Diferencia entre token, lexema y patrón
Criterios | Simbólico | lexema | Patrón |
---|---|---|---|
Definición | El token es básicamente una secuencia de caracteres que se tratan como una unidad, ya que no se pueden desglosar más. | Es una secuencia de caracteres en el código fuente que coinciden con reglas de lenguaje predefinidas dadas para que cada lexema se especifique como un token válido. | Especifica un conjunto de reglas que sigue un escáner para crear un token. |
Interpretación del tipo Palabra clave | todas las palabras clave reservadas de ese idioma (main, printf, etc.) | int, ir a | La secuencia de caracteres que componen la palabra clave. |
Interpretación del identificador de tipo | nombre de una variable, función, etc. | principal, un | debe comenzar con el alfabeto, seguido del alfabeto o un dígito. |
Interpretación del tipo Operador | todos los operadores se consideran tokens. | +, = | +, = |
Interpretación del tipo Puntuación | cada tipo de puntuación se considera una ficha. por ejemplo, punto y coma, paréntesis, coma, etc. | (, ), {, } | (, ), {, } |
Interpretación de tipo Literal | una regla gramatical o un literal booleano. | «¡Bienvenidos a GeeksforGeeks!» | cualquier string de caracteres (excepto ‘ ‘) entre ” y “ |
El resultado de la fase de análisis léxico:
La salida de Lexical Analyzer sirve como entrada a Syntax Analyzer como una secuencia de tokens y no como una serie de lexemas porque durante la fase de análisis de sintaxis la unidad individual no es vital, pero la categoría o clase a la que pertenece este lexema es considerable.
Ejemplo:
z = x + y; This statement has the below form for syntax analyzer <id> = <id> + <id>; //<id>- identifier (token)
El analizador léxico no solo proporciona una serie de tokens, sino que también crea una tabla de símbolos que consta de todos los tokens presentes en el código fuente, excepto los espacios en blanco y los comentarios.
Publicación traducida automáticamente
Artículo escrito por annieahujaweb2020 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA