- Una expresión entre paréntesis.
- Una lista entre corchetes.
- Un nombre.
- Un literal (cadena o entero).
CELL& Script::ReadPrimaryExpression(ISTREAM& i) { TOKEN t=ReadToken(i); switch(t.type) {
Los tokens T_RAW consistían en un único carácter. Este carácter podrá ser o bien un paréntesis de apertura “(” o un corchete de apertura “[”. En el primer caso estamos en una expresión entre paréntesis y en el segundo caso una lista. Como vemos, no hay ambigüedad posible.
case T_RAW: switch(t.raw) {
En el caso de expresión entre paréntesis, leemos la expresión. Comprobamos que el paréntesis se cierra usando ConsumeRawToken() que ya vimos en las funciones de ayuda. Finalmente, retornamos la celda leída en la expresión interna como la correspondiente a la parentización.
case '(': { CELL& x=ReadExpression(i); ConsumeRawToken(i, ')', L"Expecting closing round bracket"); return x; }
En el caso de una lista, usamos la función ReadList() indicando que la lista se separa por comas y termina en corchete “]”. Veremos la función ReadList() en la parte 25 de esta serie.
case '[': return ReadList(i, ',', ']'); default: throw L"Unexpected token"; }
Tanto en el caso de nombres como de literales es muy fácil devolver la celda ya que el token la generaba y guardaba.
case T_NAME: return *t.data; case T_LITERAL: return *t.data; default: throw L"Expecting a primary expression"; } }
Como observamos, lo hecho no es más que una regla de un reconocedor descendente recursivo. En la siguiente parte de esta serie nos dedicaremos a las expresiones postfijas y prefijas.
0 comentarios:
Publicar un comentario