REPL para intérprete usando Flex / Bison

Eu escrevi um intérprete para uma linguagem do tipo C, usando Flex e Bison para o scanner / analisador. Está funcionando bem ao executar arquivos de programa completos.

Agora estou tentando implementar um REPL no intérprete para uso interativo. Eu quero que ele funcione como os intérpretes de linha de comando em Ruby ou ML:

Show a promptceite uma ou mais instruções na linhSe a expressão estiver incompleta exibir um prompt de continuação permita que o usuário continue digitando linhasQuando a linha termina com uma expressão completaecho o resultado da avaliação da última expressão mostre o prompt principal

minha gramática começa com umtop_level production, que representa uma única declaração no idioma. O lexer está configurado para o modo interativo no stdin. Estou usando o mesmo scanner e gramática nos modos de arquivo completo e REPL, porque não há diferença semântica nas duas interface

Meu loop de avaliação principal está estruturado desta maneir

while (!interpreter.done) {
    if (interpreter.repl)
        printf(prompt);
    int status = yyparse(interpreter);
    if (status) {
        if (interpreter.error)
            report_error(interpreter);
    }
    else {
        if (interpreter.repl)
            puts(interpreter.result);
    }
}            

Isso funciona bem, exceto pela lógica de prompt e eco. Se o usuário digitar várias instruções em uma linha, esse loop imprimirá prompts e expressões supérfluos. E se a expressão continuar em várias linhas, esse código não imprimirá prompts de continuação. Esses problemas ocorrem porque a granularidade da lógica de prompt / eco é umtop_level na gramática, mas a lógica de leitura de linha é profunda no lexe

Qual é a melhor maneira de reestruturar o ciclo de avaliação para lidar com o prompt e eco do REPL? Isso é

como posso exibir um prompt por linhacomo posso exibir o prompt de continuação no momento certocomo posso saber quando uma expressão completa é a última de uma linha

(Prefiro não alterar o idioma do scanner para passar tokens de nova linha, pois isso alterará gravemente a gramática. ModificandoYY_INPUT e adicionar algumas ações à gramática do Bison seria bom. Além disso, estou usando o Flex 2.5.35 e o Bison 2.3 fornecidos com o Xcode.)

questionAnswers(2)

yourAnswerToTheQuestion