Compilador Rust escrito em Lua

174 views
Skip to first unread message

Gabriel Margarido

unread,
Aug 1, 2022, 8:33:50 PM8/1/22
to Lua BR

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ímbolostodas 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

Tomás Guisasola

unread,
Aug 1, 2022, 8:42:21 PM8/1/22
to lua...@googlegroups.com
Oi Gabriel

Melhor usar LPEG:

http://www.inf.puc-rio.br/~roberto/lpeg/

É mais complicado no início, mas vai ser melhor para ter um código
robusto e legível.

Abraço,
Tomás

Em seg., 1 de ago. de 2022 às 21:33, Gabriel Margarido
<gabrielmar...@gmail.com> escreveu:
> --
> Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
> Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/lua-br/c4b6d289-91e6-4a6c-96e8-a95471088124n%40googlegroups.com.

Breno Ramalho Lemes

unread,
Aug 1, 2022, 10:07:12 PM8/1/22
to lua...@googlegroups.com
Olá,

Uma boa opção é uma máquina de estados. Eu rascunhei uma linguagem estilo PHP em Lua uma vez. Nem está completo, o include parece que nem foi implementado (faz tempo, nem lembro bem). Mas é um único arquivo (o outro é um exemplo) e simples o bastante para entender a ideia da máquina de estado. Era Lua 5.1, se quiser rodar em versão mais recente precisa trocar o loadstring e não sei se mais alguma coisa.


Off-topic: é impressão minha ou é mais um portugol? Ninguém merece portugol, só faculdade mesmo que tem essa fixação inexplicável por portugol...

--

Eduardo Gimenez

unread,
Aug 1, 2022, 10:49:33 PM8/1/22
to lua...@googlegroups.com
Você não deveria usar regexp/pattern para isso, tokenizer tem a obrigação de passar por cada caractere do arquivo. É fácil de corrigir, basta guardar o delimitador que guardou a string e ir adicionando ao buffer os caracteres seguintes até encontrar o delimitador da string ou até encontrar EOL (fim da linha), se encontrar o delimitador final então a string está completa caso contrário não foi fechada.

Reply all
Reply to author
Forward
0 new messages