Sabemos que temos o prismac (prisma compilador), então para quê fazer um compilador prisma feito na própria linguagem?
Bem, primeiramente, porque era possível, assim testamos o potencial da linguagem. Escrever um compilador na própria linguagem indica que ela é poderosa.
Segundo, para adquirir conhecimentos e por curiosidade, foi assim que surgiu o pric (prisma compilador “alternativo”);
Algumas vantagens:
- O arquivo de saída é um pouco menor que o gerado pelo prismac.
- Em linux, o arquivo gerado é automaticamente definido como executável e abrir com prisma. Em Windows não.
- Além da opção que junta fontes prisma em um só arquivo compilável.
Comandos para compilar:
Linux terminal:
1 |
pric -o saida.pbrexe fonte.prisma |
Windows cmd:
1 |
C:\\Prisma\\1.0\\bin\\pric.pbrexe -o saida.pbrexe fonte.prisma |
Ou com vários fontes prisma:
pric -o saida.pbrexe principal.prisma fonte2.prisma fonte3.prisma
Se quiser apenas unir os vários fontes em um só arquivo:
pric -c saida.prisma principal.prisma fonte2.prisma fonte3.prisma
É possível juntar quantos arquivos forem necessários, 5, 10, 100, 1000 ou 100000 arquivos prisma num só. Claro que há o limite de hardware e memória de seu pc.
Graças a essa funcionalidade de embutir o #!/usr/local/bin/prisma no arquivo bytecode podemos compilar programas prisma cgi para não mostrar os fontes.
No Windows é embutido automaticamente #!”C:\\Prisma\\1.0\\bin\\prisma.exe” Caso sua instalação seja diferente modifique o código fonte do pric logo abaixo.
Vai o fonte do pric para vocês estudarem ou modificarem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
#!/usr/local/bin/prisma //prisma compiler alternativo by Adalberto. (modificado em 25 fev 2017); local pric_versao = 'pric-1.0.1' se sis.nome == 'win32' entao inclua'win'; fim local Out = 'pric.out' local esc = es.escreva; funcao escreva(...) se sis.nome == 'win32' entao para k , v em ipares{...} inicio esc( conv_c(v), ' '); fim senao imprima(...); fim fim funcao principal(Args) se #Args < 1 entao escreva[[ --------------------------------------------- Faltam parâmetros Use: pric -o prog.pric fonte.prisma caso omita o parâmetro -o a saída padrao será: pric.out Múltiplos fontes são aceitos: pric -o prog.pric font1.prisma font2.prisma etc... ]] sis.saia(0); senao se Args[1] == '-v' entao imprima(pric_versao); leia(); sis.saia(0); fim local str , err= Junte_todos(Args); se nao str entao escreva(err); sis.saia(1) fim se Args[1] == '-o' entao Out = Args[2]; local ret, err = Compile(Args,str); se nao ret entao escreva(err); sis.saia(1) fim; senaose Args[1] == '-c' entao Out = Args[2]; local ret, err = GraveObjeto(str); se nao ret entao escreva(err); sis.saia(1) fim; fim fim fim funcao Junte_todos(Args) local str = '//GERADO AUTOMATICAMENTE POR PRIC (COMPILADOR PRISMA FEITO EM PRISMA)##\n'; str = str .. '//' .. sis.data(); se Args[1] <> '-o' e Args[1] <> '-c' entao para i = 2 , #Args inicio//pega do segundo em diante local a = es.abra(Args[i], 'leitura'); se a entao str = str .. '\n\n' .. '//fonte:' .. i .. '\n\n' .. a:leia'*t'; a:feche(); senao retorne falso, 'Erro: não foi possível abrir o arquivo: ' .. Args[i]; fim fim //pega o principal e coloca em ultimo: local a = es.abra(Args[1], 'leitura'); se a entao str = str .. '\n\n' .. '//fonte:' .. 1 .. '\n\n' .. a:leia'*t'; a:feche(); senao retorne falso, 'Erro: não foi possível abrir o arquivo: ' .. Args[1]; fim senaose Args[1] == '-o' ou Args[1] == '-c' entao//caso o parametro seja -o se nao Args[2] e nao Args[3] entao retorne falso, 'Erro: não faltam parâmetros 2 e 3 (prog.pric fonte.prisma)'; fim local cont = 2; para i = 4 , #Args inicio //comeca em 3 pois o 1 é -o e o 2 é o programa compilado.. local a = es.abra(Args[i],'leitura'); se a entao str = str .. '\n\n' .. '//fonte:' .. cont .. '\n' .. a:leia'*t'; a:feche(); senao retorne falso, 'Erro: não foi possível abrir o arquivo: ' .. Args[i]; fim cont = cont + 1; fim //pega o principal e coloca em ultimo: local a = es.abra(Args[3], 'leitura'); se a entao str = str .. '\n\n' .. '//fonte:' .. 1 .. '\n\n' .. a:leia'*t'; a:feche(); senao retorne falso, 'Erro: não foi possível abrir o arquivo: ' .. Args[3]; fim fim retorne str; fim funcao Compile(Args,str) se nao str entao escreva( err ); sis.saia(1) fim; local func, err = carregue(str,'='); //carregando a string em uma funcao. se nao func entao escreva(err); sis.saia(1); fim local byte_code = string.compile(func); se Args[1] == '-o' entao Out = args[2] fim local a = es.abra(Out, 'escritabin'); se a entao se sis.nome == 'linux' entao a:escreva('#!/usr/local/bin/prisma\n'); //executável em prisma Linux senaose sis.nome == 'win32' entao a:escreva('#!"C:\\Prisma\\1.0\\bin\\prisma.exe\n"'); //executável em prisma Windows fim a:escreva(byte_code); a:feche(); se sis.nome == 'linux' entao sis.execute( 'chmod +x ' .. Out); fim retorne verdadeiro; senao retorne falso, 'Erro: não foi possível escrever em arquivo: ' .. Out; fim fim funcao GraveObjeto(str)//grava os arquivos unidos sem compilar. local a = es.abra(Out,'escrita'); se a entao //a:escreva('#! /usr/bin/env prisma\n'); a:escreva(str); a:feche(); //sis.execute( 'chmod +x ' .. Out); retorne verdadeiro; senao retorne falso, 'Erro: não foi possível escrever em arquivo: ' .. Out; fim fim |