Estoy haciendo un ensamblador 8051.Diseño de patrón para hacer un ensamblador
Antes de todo es un señalizador que dice siguientes fichas, establece indicadores de error, reconoce EOF, etc.
Luego está el bucle principal del compilador, que lee próximos fichas y compruebe de las sentencias válidas:
mnemonic= NextToken();
if (mnemonic.Error)
{
//throw some error
}
else if (mnemonic.Text == "ADD")
{
...
}
else if (mnemonic.Text == "ADDC")
{
...
}
Y continúa en varios casos. Peor que eso es el código dentro de cada caso, que verifica los parámetros válidos y luego los convierte en código compilado. En este momento se ve así:
if (mnemonic.Text == "MOV")
{
arg1 = NextToken();
if (arg1.Error) { /* throw error */ break; }
arg2 = NextToken();
if (arg2.Error) { /* throw error */ break; }
if (arg1.Text == "A")
{
if (arg2.Text == "B")
output << 0x1234; //Example compiled code
else if (arg2.Text == "@B")
output << 0x5678; //Example compiled code
else
/* throw "Invalid parameters" */
}
else if (arg1.Text == "B")
{
if (arg2.Text == "A")
output << 0x9ABC; //Example compiled code
else if (arg2.Text == "@A")
output << 0x0DEF; //Example compiled code
else
/* throw "Invalid parameters" */
}
}
Para cada uno de los mnemónicos que tengo que comprobar si hay parámetros válidos a continuación, crear el código compilado correcta. Códigos muy similares para verificar los parámetros válidos para cada repetición mnemónica en cada caso.
¿Existe un patrón de diseño para mejorar este código?
¿O simplemente una forma más simple de implementar esto?
Editar: Acepté la respuesta de plinth, gracias a él. Aún si tienes ideas sobre esto, estaré feliz de aprenderlas. Gracias a todos.
¡Mi memoria es de aproximadamente 200 KiB y estoy tan contento de que hayas reemplazado el código anterior orientado a objetos con este! Ahora una pregunta de seguimiento (lo sé ...): ¿Fue su forma anterior de usar 'Instruction8051 {public string Mnemonic {get; conjunto; } public List Info {get; conjunto; }} 'el patrón de comando? ¿Y hay razones/situaciones en las que prefiero el patrón de comando para buscar tablas? –
Hossein
¿Patrón de comando? No, ambos habrían estado enfocados en las tablas de búsqueda. El código anterior de C# es uno que aprovecha el soporte del idioma para colecciones genéricas y propiedades automáticas. – plinth