2010-08-14 14 views
9

para nuestra clase de teoría de compilación, tenemos la tarea de crear un intérprete simple para nuestro propio lenguaje de programación diseñado. Estoy usando jflex y cup como mis generadores, pero estoy un poco atascado con lo que es un error léxico. Además, ¿se recomienda que use la función de estado de jflex? se siente mal, ya que parece que el analizador es más adecuado para manejar ese aspecto. y ¿recomienda alguna otra herramienta para crear el idioma? Lo siento si estoy impaciente, pero se vence el martes.¿Qué es un ejemplo de error léxico y es posible que un idioma no tenga errores léxicos?

Respuesta

14

Un error léxico es cualquier entrada que pueda ser rechazada por el lexer. En general, esto se debe a que el reconocimiento de tokens no coincide con el final de las reglas que ha definido. Por ejemplo (en ninguna sintaxis particular):

[0-9]+ ===> NUMBER token 
[a-zA-Z] ===> LETTERS token 
anything else ===> error! 

Si se piensa en un analizador léxico como una máquina de estado finito que acepta cadenas de entrada válidos, a continuación, los errores van a ser las cadenas de entrada que no resultan en ese estado finito máquina que alcanza un estado de aceptación.

El resto de su pregunta no me resultaba clara. Si ya tiene algunas herramientas que está utilizando, tal vez sea mejor que aprenda cómo lograr lo que quiere lograr usando esas herramientas (no tengo experiencia con ninguna de las herramientas que mencionó).

EDIT: Después de volver a leer su pregunta, hay una segunda parte que puedo responder. Es posible que un idioma no tenga errores léxicos; es el idioma en el que cualquier cadena de entrada es una entrada válida.

2

Un error léxico podría ser un carácter no válido o inaceptable por el lenguaje, como '@' que se rechaza como un error léxico para los identificadores en Java (está reservado).

Los errores léxicos son los errores arrojados por su lexer cuando no pueden continuar. Lo que significa que no hay manera de reconocer un lexema como un token válido para usted más lexer. Los errores de sintaxis, en el otro lado, serán lanzados por su escáner cuando un conjunto dado de ya reconocidos tokens válidos no coincidan con ninguno de los lados derechos de sus reglas de gramática.

se siente mal, ya que parece que el analizador es más adecuado para el manejo de ese aspecto

No. parece porque context-free languages include regular languages (lo que significa que un programa de análisis puede hacer el trabajo de un analizador léxico) Pero tenga en cuenta que un analizador es un autómata de pila y empleará recursos informáticos adicionales (la pila) para reconocer algo que no requiere que se reconozca una pila (una expresión regular). Esa sería una solución subóptima.

NOTA: por expresión regular, quiero decir ... expresión regular en el sentido de Jerarquía de Chomsky, no una clase java.util.regex.*.

+0

'$' está reservado en Java? – Ypnypn

+0

No, no lo es. Mal ejemplo. Déjame cambiarlo. – mschonaker

+0

Hecho. '$' solo se desaconseja, ya que se usa para el cambio de nombre de clase. – mschonaker

1

error léxico es cuando la entrada no pertenece a ninguna de estas listas: palabras clave: "if", "else", "main"... símbolos: '=','+',';'... símbolos dobles: ">=", "<=", "!=", "++" Variables: [a-z/A-Z]+[0-9]*
números: [0-9]*

ejemplos: 9var : error, número antes de caracteres, no una variable y tampoco una palabra clave. $: error

lo que no sé es si algo así como más de un símbolo, uno tras otro se acepta, como "+ -"

+0

9var es un error de systax. –

0

compilador puede coger un error cuando se tiene la gramática en ella! Dependerá del compilador si tiene la capacidad (alcance) de detectar los errores léxicos o no. Si se decide durante el desarrollo del compilador qué tipos de error léxico y cómo (de acuerdo con la gramática) se van a manejar. Por lo general, todos los compiladores famosos y más utilizados tienen estas capacidades.

Cuestiones relacionadas