Enviado em 01/08/2015 - 18:35h
Olá, eu queria criar uma linguagem de programação estilo C mas interpretada. Eu conheço alguns livros em português mas o conteúdo deles tem pouca explicação sobre como realmente fazer uma linguagem. Digo, lá tem teoria demasiadamente com pouca prática, esta vem em um deles de forma de pseudo código em ptBR.Enviado em 03/08/2015 - 08:00h
Bom dia, Sam.$ cat codigo.c | indent -kr -i8 $ man indent "(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.
Enviado em 03/08/2015 - 12:29h
Se criar um compilador ou interpretador pra uma linguagem já é muito difícil, imagina criar a linguagem. Você acha realmente necessário ? Isso é trabalho pra alguns anos e muitas pessoas.Enviado em 03/08/2015 - 19:15h
Olá !/* **------------------------------------------------------------------- ** ** "Exemplo/esqueleto" de modelo de uma linguagem: ** **------------------------------------------------------------------- */ static char *str; static int token [1024]; static char prog [10000]; static int tok; static int erro; enum { TOK_INT = 255, TOK_IF, TOK_FOR, //------------ TOK_ID, TOK_NUMBER, TOK_STRING }; int lex (void) { switch (*str) { // ... aqui: // 01: ler/incrementa str: // 02: modifica token[] // 03: retorna ( TOK_INT, TOK_IF, TOK_FOR, TOK_MUMERO, TOK_STRING ... ) // // ou: case 0: return 0; default: return *str++; } return 0; } int stmt (VM *a) { switch (tok) { case '{' tok = lex(); while (tok && tok != '}') stmt(a); // processa um BLOCO tok = lex(); break; case TOK_INT: // processa int ... usando lex(); break; case TOK_IF: // processa if ... usando lex(); break; case TOK_FOR: // processa for ... usando lex(); break; default: expression (a); } return tok; } void expression (VM *a) { // aqui pode ser typo: // 01: variavel // 02: funcao // 03: ou ERRO ;) // if (tok == TOK_ID) { expr0(a); // .... } tok = lex(); } int Parse (VM *a, char *text) { str = text; erro = 0; while (stmt(a)) { } // SIM: um loop vazio para ser mais claro return erro; } int main (int argc, char *argv[]) { VM *fe; // ABRE UM ARQUIVO E ARMAZENA EM ( prog ): // ... // CRIA/INICIA O FRONTEND: // ... if (!Parse(fe, prog)) { // executa o "FRONTEND" } return 0; }
// +, - : soma void expr0 (ASM *a) { int op; expr1(a); while ((op=tok) == '+' || (op=tok) == '-') { tok=lex(); expr1(a); switch (op) { case '+': asm_add_eax_esp (a); break; case '-': asm_sub_eax_esp (a); break; } } } // *, / : multiplica void expr1 (ASM *a) { int op; expr2(a); while ((op=tok) == '*' || (op=tok) == '/') { tok=lex(); expr2(a); switch (op) { case '*': asm_imul_eax_esp(a); break; case '/': break; } } } // ( void expr2 (ASM *a) { if(tok=='('){ tok=lex(); expr0(a); if(tok != ')'){ printf ("ERRO )\n"); erro_line (" "); } tok=lex(); } else expr3(a); // atom: } // atom: void expr3 (ASM *a) { if(tok==TOK_ID){ VAR *v = csVarFind(token); if (v) { asm_pushl_var (a, &v->value); tok=lex(); } else erro_line("Expression var not found"); } else if(tok==TOK_NUMBER){ asm_push_number (a, atoi(token)); tok=lex(); } else erro_line("Expression"); }
Enviado em 09/08/2015 - 11:29h
Enviado em 09/08/2015 - 19:46h
Opa, tudo certo?Enviado em 10/08/2015 - 01:21h
Eu lhe apresento o "Livro do Dragão"Enviado em 11/08/2015 - 02:54h
Pelo que me disseram a primeira edição do Livro do Dragão em português é incompleta.Automatizando digitação de códigos 2FA no browser
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Como converter imagens PNG/JPEG para SVG em linha de comando
Fez porcaria no teu repositório Git? Aprenda a restaurar uma versão anterior do seu código!
Restaurando Fontes de Download do Hydra no Linux
Atualizando "na marra" o YT-DLP quando começa a dar erro de downloads
Como instalar o WPS com interface e corretor ortográfico em PT-BR no Arch Linux
Erro na atualização dos pacotes (8)
Ubuntu 25.04 não instala. (15)
[AJUDA] Problemas ao atualizar BIOS da Gigabyte B550M K rev. 1.1 — “RO... (5)