Onde devo traçar a linha entre lexer e parser?
Estou escrevendo um lexer para o protocolo IMAP para fins educacionais e estou perplexo quanto ao local onde devo traçar a linha entre lexer e analisador. Veja este exemplo de uma resposta do servidor IMAP:
* FLAGS (\Answered \Deleted)
Esta resposta é definida na sintaxe formal assim:
mailbox-data = "FLAGS" SP flag-list
flag-list = "(" [flag *(SP flag)] ")"
flag = "\Answered" / "\Deleted"
Como eles são especificados como literais de strings (também conhecidos como tokens "terminais"), seria mais correto para o lexer emitir umunique token para cada um, como:
(TknAnsweredFlag)
(TknSpace)
(TknDeletedFlag)
Ou seria tão correto emitir algo assim:
(TknBackSlash)
(TknString "Answered")
(TknSpace)
(TknBackSlash)
(TknString "Deleted")
Minha confusão é que o método anterior poderia complicar demais o lexer - se\Answered
tinha dois significados em dois contextos diferentes, o lexer não emitia o token certo. Como um exemplo artificial (essa situação não ocorrerá porque os endereços de email estão entre aspas), como o lexer lidaria com um endereço de email como \ [email protected]? Ou a sintaxe formal foi projetada para nunca permitir que essa ambiguidade surja?