Respuesta corta: análisis sintáctico es no un subconjunto de la compilación.
Respuesta larga: generalmente, hay 3 pasos para la conversión de fuente a otro formato:
- Lexing, que convierte de alguna forma de entrada a una corriente token.
- Análisis, que convierte la secuencia de token en un árbol de sintaxis abstracta (AST).
- Compilación, que convierte el AST en un conjunto de instrucciones ejecutables (código nativo, código de bytes, etc.).
(Para idiomas muy simples, puede que ni siquiera necesite un analizador, es posible que pueda compilar la secuencia de token directamente, o su analizador podría generar código nativo directamente.)
así que empieza con una cadena de texto en este aspecto:
let x = 0
while x < 10
print x
x := x + 1
Un analizador léxico se va a convertir en una corriente razón, probablemente algo como esto:
[LET; String("x"); EQ; Int(0); NEWLINE; WHILE; String("x");
LT; VAL(10); ... ]
El analizador convertirá el transmita en una estructura de datos más significativa, su árbol de sintaxis abstracto:
// AST definition
type expr =
| Block of expr list
| Assign of string * expr
| While of expr * expr
| Call of string * expr list
| Add of expr * expr
| Var of string
| Int of int
// AST instance created from token stream
Block
[
Assign("x", Int(10));
While
(
LessThan(Var("x"), Int(10)),
Block
[
Call("print", [Var("x")]);
Assign("x", Add(Var("x"), Int(1)));
]
);
]
Una vez tiene un AST, puede hacer lo que quiera con él:
- Convierta el AST en código nativo (compilación).
- o puede interpretar el AST sobre la marcha, lo que puede hacer con un lenguaje de programación dinámico o un motor de plantillas.
- o puede repetir el AST para crear un resaltador de sintaxis.
- o puede recorrer el AST y enviar el código equivalente en otro idioma.
- o puede buscar todas las instancias de
Var("x")
y reemplazarlas por Var("y")
similar a una herramienta de refactorización de código).
Por lo tanto, si bien normalmente analiza la entrada antes de compilar, eso no es lo mismo que decir que el análisis es un subconjunto de la compilación.
compilar requiere un análisis, pero el análisis no requiere compilación. Hay una relación, pero no una relación is-a. – DwB
Añadiendo otra pieza al rompecabezas, en asp.net podemos implementar los archivos de código fuente directamente sin compilación debido a [¡Compilación dinámica!] (Http://msdn.microsoft.com/en-us/library/ms366723.aspx) –