parsing - programacion - Parsers y compiladores para Dummies. ¿Donde empezar?
lenguaje de programacion lua pdf (3)
Esta pregunta ya tiene una respuesta aquí:
- Aprendiendo a escribir un compilador [cerrado] 40 respuestas
Este es un buen listado , pero ¿cuál es el mejor para un newb completo en esta área? Uno para alguien que proviene de un fondo de nivel superior (VB6, C #, Java, Python), que no está familiarizado con C o C ++. Estoy mucho más interesado en el análisis escrito a mano frente a Lex / Yacc en esta etapa.
Si acabara de graduarme en Ciencias de la Computación en lugar de Psicología, podría haber tomado una clase sobre esto en la universidad. Oh bien.
Si eres un n00b completo, el recurso más accesible (en ambos sentidos del término) es probablemente el tutorial de Jack Crenshaw . No es ni mucho menos exhaustivo, pero para empezar, no puedo pensar en nada cercano excepto en libros que están agotados desde hace mucho tiempo.
Me gustaría sugerir un artículo que escribí llamado Implementación de lenguajes de programación utilizando C # 4.0 . Intenté hacer que sea accesible para los recién llegados. No es exhaustivo, pero luego debería ser más fácil comprender otros textos más avanzados.
Por favor, eche un vistazo a: aprender a escribir un compilador
También es interesante:
- cómo escribir un lenguaje de programación
- análisis donde puedo aprender al respecto
- recursos de aprendizaje sobre intérpretes y compiladores de analizadores (de acuerdo, ya mencionó este.
Y hay más sobre el tema. Pero puedo dar una breve introducción:
El primer paso es el análisis léxico. Una secuencia de caracteres se traduce a una secuencia de tokens. Los tokens pueden ser simples como == <= + - (etc) y pueden ser complejos como identificadores y números. Si quieres puedo profundizar en esto.
El siguiente paso es traducir el tokenstream en un syntaxtree u otra representación. Esto se llama paso de análisis sintáctico.
Antes de que pueda crear un analizador, debe escribir la gramática. Por ejemplo, creamos un analizador de expresiones:
Tokens
addOp = ''+'' | ''-'';
mulOp = ''*'' | ''/'';
parLeft = ''('';
parRight = '')'';
number = digit, {digit};
digit = ''0''..''9'';
Each token can have different representations: + and = are both addOp and
23 6643 and 223322 are all numbers.
El idioma
exp = term | exp, addOp, term;
// an expression is a series of terms separated by addOps.
term = factor | term, mulOp, factor;
// a term is a series of factors separated by mulOps
factor = addOp, factor | parLeft, exp, parRight | number;
// a factor can be an addOp followed by another factor,
// an expression enclosed in parentheses or a number.
El lexer
Creamos un motor de estado que recorre la secuencia de char, creando un token
s00
''+'', ''-'' -> s01 // if a + or - is found, read it and go to state s01.
''*'', ''/'' -> s02
''('' -> s03
'')'' -> s04
''0''..''9'' -> s05
whitespace -> ignore and retry // if a whitespace is found ignore it
else ERROR // sorry but we don''t recognize this character in this state.
s01
found TOKEN addOp // ok we have found an addOp, stop reading and return token
s02
found TOKEN mulOp
s03
found TOKEN parLeft
s04
found TOKEN parRight
s05
''0''..''9'' -> s05 // as long as we find digits, keep collecting them
else found number // last digit read, we have a number
Analizador
Ahora es el momento de crear un analizador / evaluador simple. Esto está completo en el código. Normalmente se crean usando tablas. Pero lo mantenemos simple. Lee los tokens y calcula el resultado.
ParseExp
temp = ParseTerm // start by reading a term
while token = addOp do
// as long as we read an addop keep reading terms
if token(''+'') then temp = temp + ParseTerm // + so we add the term
if token(''-'') then temp = temp - ParseTerm // - so we subtract the term
od
return temp // we are done with the expression
ParseTerm
temp = ParseFactor
while token = mulOp do
if token(''*'') then temp = temp * ParseFactor
if token(''/'') then temp = temp / ParseFactor
od
return temp
ParseFactor
if token = addOp then
if token(''-'') then return - ParseFactor // yes we can have a lot of these
if token(''+'') then return ParseFactor
else if token = parLeft then
return ParseExpression
if not token = parRight then ERROR
else if token = number then
return EvaluateNumber // use magic to translate a string into a number
Este fue un simple ejemplo. En ejemplos reales, verá que el manejo de errores es una gran parte del analizador.
Espero que esto se aclare un poco ;-).