¿Dónde debo dibujar la línea entre lexer y parser?

Estoy escribiendo un lexer para el protocolo IMAP con fines educativos y no sé dónde debo trazar la línea entre el lexer y el analizador. Tome este ejemplo de una respuesta del servidor IMAP:

* FLAGS (\Answered \Deleted)

Esta respuesta se define en la sintaxis formal como esta:

mailbox-data   = "FLAGS" SP flag-list
flag-list      = "(" [flag *(SP flag)] ")"
flag           = "\Answered" / "\Deleted"

ado que se especifican como literales de cadena (también conocidos como tokens "terminales"), ¿sería más correcto que el lexer emitiera un token único para cada uno, como:

(TknAnsweredFlag)
(TknSpace)
(TknDeletedFlag)

O sería tan correcto emitir algo como esto:

(TknBackSlash)
(TknString "Answered")
(TknSpace)
(TknBackSlash)
(TknString "Deleted")

Mi confusión es que el método anterior podría complicar demasiado el lexer, si\Answered tenía dos significados en dos contextos diferentes, el lexer no emitiría el token correcto. Como ejemplo artificial (esta situación no ocurrirá porque las direcciones de correo electrónico están entre comillas), ¿cómo trataría el lexer una dirección de correo electrónico como \ [email protected]? ¿O la sintaxis formal está diseñada para nunca permitir que surja tal ambigüedad?

Respuestas a la pregunta(3)

Su respuesta a la pregunta