Olá a todos que programam em Lua,
Faz alguns dias que estou trabalhando num protótipo de um compilador que compilará os arquivos de código-fonte desta linguagem de programação própria para código Rust, sendo o compilador desta linguagem escrito todo em Lua.
Um problema que encontrei foi: Quando o lexer encontra uma string com um espaço dentro dela, ele quebra a string neste ponto e retorna um erro de compilação, pois não foi possível encontrar o final da string (ou seja, as aspas duplas ou simples que indicam o fechamento/término da string).
Basicamente, o trabalho que o lexer tem dentro do compilador é tokenizar (separar em símbolos) todas as palavras do arquivo. Ele utiliza a função string.match(str, [^%s]+) do Lua para separar uma palavra da outra utilizando o caractere de espaço como referência e colocá-las numa tabela/array (que chamei de t), como documentado no lua.org [%s]:
-- lang/lexical_analyzer.lua
t = {}
local line = read_file(arg[1])
local token = "[^%s]+"
for token in string.match(line,regex)
table.insert(t, token)
end
A princípio me parece que o problema seria a expressão regular que eu estou utilizando para realizar a análise e separação de cada token.
Uma possível solução que pensei seria: Utilizar os espaços [%s] para tokenizar o arquivo de cógido-fonte (.cr), porém somente se estes espaços estiverem fora das aspas duplas ou simples.
Exemplo: escreval "Hello world"
Solução:
escreval → Lexema
"Hello world" → Lexema
O que acontece atualmente (bug) – Erro de compilação:
escreval → Lexema
"Hello → Lexema
world" → Lexema
Gostaria de saber se alguém tem alguma ideia de como seria possível resolver este bug na compilação, porque eu não faço ideia de como corrigí-lo. Qualquer ajuda será bem-vinda!
Link do repositório no GitHub: https://github.com/PolskiDev/lexer-v2
Rust Lang: https://www.rust-lang.org/pt-BR/tools/install
Grato,
Gabriel Margarido
--
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/lua-br/CAPh%3DQAq45N6S9biFAqBEFSLKo_m_7syBxyMfH9g%2BA6pBJQREXw%40mail.gmail.com.