Sofrendo com o ML-Lex
Ok, como eu disse, estou brincando um pouco com compiladores; fazendo um compilador para uma linguagem pequena com sintaxe parecida com ML em duas versões: uma imperativa e a outra funcional. O compilador está sendo escrito em SML, um tipo de tarefa bastante adequado para a linguagem.
O problema começa nas ferramentas do front-end: o gerador de analisadores léxicos ML-Lex e o gerador de analisadores sintáticos MLYacc. O que atrapalha é que eles seguem muito de perto as ferramentas tradicionais lex e yacc do Unix, que foram feitas em C para gerar código C. Com isso, é impossível fugir de um estilo muito imperativo na criação dos analisadores. A situação não parece ser muito melhor em OCaml, o que é uma pena, já que compiladores e outros processadores de linguagens ficam condenados a esse estilo imperativo nessas linguagens que, a princípio, promovem um estilo de programação mais funcional. Um projeto interessante, mas para o qual eu não tenho tempo, seria pesquisar maneiras de fazer geradores de analisadores de maneira mais funcional, sem perdas significativas de eficiência. Uma idéia possível é usar monadic parser combinators ao estilo do parsec (feito em Haskell). Apesar das linguagens ML não suportarem mônadas nativamente, é possível criar construções baseadas em mônadas do mesmo jeito; talvez a falta de suporte sintático deixe uma ferramenta dessas bem menos prática de usar do que no caso do Haskell, mas só investigando.
Enfim, o lexer está pronto, incluindo seqüências de escape em strings, comentários aninhados e outros detalhes que dão um pouco mais de trabalho. Agora, de volta ao trabalho no parser...
O problema começa nas ferramentas do front-end: o gerador de analisadores léxicos ML-Lex e o gerador de analisadores sintáticos MLYacc. O que atrapalha é que eles seguem muito de perto as ferramentas tradicionais lex e yacc do Unix, que foram feitas em C para gerar código C. Com isso, é impossível fugir de um estilo muito imperativo na criação dos analisadores. A situação não parece ser muito melhor em OCaml, o que é uma pena, já que compiladores e outros processadores de linguagens ficam condenados a esse estilo imperativo nessas linguagens que, a princípio, promovem um estilo de programação mais funcional. Um projeto interessante, mas para o qual eu não tenho tempo, seria pesquisar maneiras de fazer geradores de analisadores de maneira mais funcional, sem perdas significativas de eficiência. Uma idéia possível é usar monadic parser combinators ao estilo do parsec (feito em Haskell). Apesar das linguagens ML não suportarem mônadas nativamente, é possível criar construções baseadas em mônadas do mesmo jeito; talvez a falta de suporte sintático deixe uma ferramenta dessas bem menos prática de usar do que no caso do Haskell, mas só investigando.
Enfim, o lexer está pronto, incluindo seqüências de escape em strings, comentários aninhados e outros detalhes que dão um pouco mais de trabalho. Agora, de volta ao trabalho no parser...
0 Comments:
Post a Comment
<< Home