Desafio - Compilador (Inventem uma liguagem)

Started by KTachyon, May 04, 2006, 03:44:16 AM

Previous topic - Next topic

KTachyon

É apenas uma linguagem de programação básica. Inicialmente apenas irá funcionar em linha de comandos.
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

Teotónio Ricardo

penso que o @ será uma boa opção!

KTachyon

Ok. Já comecei a fazer a parte do Lex, mas sem a parte do Yacc não é muito fácil de parceber como isto funciona, por isso, por enquanto só aki coloco a parte do Lex. Depois, kdo tiver a parte do Yacc feita, coloco aki a explicação.

%{

#include "structures.h"

#include "y.tab.h"

#include

#include

%}



%%

"//".*n {line++;}



"-"?[0-9]+ {yylval.inteiro = atoi(yytext); return INTEIRO;}

"-"?[0-9]+"."[0-9]+ {yylval.nint = atof(yytext); return FLOAT;}

""".""" {yylval.str = (*char) strdup(yytext);}



"@"[a-zA-Z0-9-_]* {yylval.var = (char*) strdup(yytext); return VAR;}



"SE" {return SE;}

"OU SE" {return OU_SE;}

"SENÃÆ'O" {return SENAO;}

"DEFINE" {return DEFINE;}

"COM" {return COM;}



"=" {return EQUAL;}

">" {return MAIOR;}

"<" {return MENOR;}

"<=" {return MENOR_EQ;}

">=" {return MAIOR_EQ;}



"+" {return SOMA;}

"-" {return SUBT;}

"*" {return MULT;}

"/" {return DIVI;}



"," {return BLOCK_INIT;}

"." {return BLOCK_END;}

":" {return BLOCK_DEF_INIT;}



[ t] ;



n {line++;}



. return yytext[0];

%%

int yywrap()

{

return 1;

}
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

kingless


Pedrolopes

pa...

uma ideia que podima aproveitar era a usada por Python... em que as {} são substituidas pela identação! acho que é uma das melhores coisas dessa linguagem e permite que o código escrito seja mais simples e legível!

exemplo:

for (i; i < n; i++)

{

   ah e tal...

   pq é jovem...

}



só com a identação...



for (i; i < n; i++)

ah e tal...

pq é jovem...

não sei se me fiz entender...

se precisarem de algum beta tester digam

Teotónio Ricardo

PedroLopes, tive a dar uns toques em Python e parece ser bastante porreira.

KTachyon

É uma ideia, mas obrigarmos ao uso da identação queria dizer k não poderia-mos contruir código como se fosse uma frase simples, quase em português, o k normalmente facilita mais a leitura do código. Obrigar a identação axo k retira muita flexibilidade ao código.
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

kingless

Eu acho que se o codigo fosse muito facil e todo mundo podesse aprender muito rapido nao teria graça a linguagem, mas isso sou eu.

lycosman

concordo com o KhAoTiK_TaChYoN. acho que o objectivo e criar uma linguagem diferente e user-friendly... se tiver uma sintaxe baseada em lingua corrente qualquer pessoa pode xegar e começar a programar... Tipo pascal e muito facil por isso mesmo, basta saber ingles e mais umas coisitas, Delphi a mesma coisa... basic já nem tanto mas aproxima-se, C já se afasta bastante por já n ser uma linguagem exclusivamente de alto nivel, e entao assembly e que já n tem nada a ver... concluindo, uma linguagem com sintaxe familiar era o ideal...
Hooray for chainsaws :3


Teotónio Ricardo

Eu gosto do estilo da linguagem php.
É muito organizada e isso faz dela uma linguagem facil de aprender.

lycosman

Eu sou adepto ferrenho de linguagens Basic-based... Familiarizei-me com elas logo desde quando começei a programar.
Hooray for chainsaws :3


kingless

Ja passaram quase 2 semanas, e ainda não vi quase nada...

Acho que isto está muito lento!!

KTachyon

Pois... terminei agr a keima das fitas, e vou começar a trabalhar nos projectos k tenho k pôr em dia. Infelizmente só posso trabalhar no projecto nos meus tempos livres.
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

lycosman

QuoteJa passaram quase 2 semanas, e ainda não vi quase nada...

Acho que isto está muito lento!!

O KhAoTiK_TaChYoN avisou que era para ir as calmas...
Hooray for chainsaws :3


kingless

Quote
QuoteJa passaram quase 2 semanas, e ainda não vi quase nada...

Acho que isto está muito lento!!

O KhAoTiK_TaChYoN avisou que era para ir as calmas...

Não sabia que ele tinha avisado para ir nas calmas!!

KTachyon

Oki, ppl. Aki vai mais um bocado:

WPL.l
%{

#include "y.tab.h"

#include

#include

%}



%%

"//".*n {/*line++*/;}



"-"?[0-9]+ {yylval.inteiro = atoi(yytext); return INTEIRO;}

"-"?[0-9]+"."[0-9]+ {yylval.nint = atof(yytext); return FLOAT;}

""".""" {yylval.str = (char*) strdup(yytext);}



"@"[a-zA-Z0-9-_]* {yylval.var = (char*) strdup(yytext); return VAR;}



"SE" {return SE;}

"OU SE" {return OU_SE;}

"SENÃÆ'O" {return SENAO;}

"DEFINE" {return DEFINE;}

"COM" {return COM;}



"=" {return IGUAL;}

">" {return MAIOR;}

"<" {return MENOR;}

"<=" {return MENOR_IGUAL;}

">=" {return MAIOR_IGUAL;}



"+" {return SOMA;}

"-" {return SUBT;}

"*" {return MULT;}

"/" {return DIVI;}



[ t] ;



n {/*line++*/;}



. return yytext[0];

%%

int yywrap()

{

return 1;

}


WPL.y
%{

#include

#include

%}

%token INTEGER

%token FLOAT

%token STRING

%token VAR



%token SE

%token OU_SE

%token SENAO

%token DEFINE

%token COM



%token IGUAL

%token MAIOR

%token MENOR

%token MENOR_IGUAL

%token MAIOR_IGUAL



%token SOMA

%token SUBT

%token MULT

%token DIVI



%union{

int inteiro;

char *str;

float nint;

char *var;

}



%%



statement: codeline

| statement codeline

;



codelines: codeline

| codelines codeline

;



codeline: function_if

| function_defun

| function_call

| attrib

;



function_if: SE testcond \\',\\' codelines \\'.\\'

  | SE testcond \\',\\' codelines \\'.\\' cicle_else_if

  | SE testcond \\',\\' codelines \\'.\\' cicle_else_if SENAO \\',\\' codelines \\'.\\'

  | SE testcond \\',\\' codelines \\'.\\' SENAO \\',\\' codelines \\'.\\'

 ;



cicle_else_if: OU_SE testcond \\',\\' codelines \\'.\\'

| cicle_else_if OU_SE testcond \\',\\' codelines \\'.\\'

;



testcond: test_type

| test_type test_oper test_type

;



test_type: INTEGER

| FLOAT

| VAR

;



test_oper: IGUAL

| MAIOR

| MENOR

| MAIOR_IGUAL

| MENOR_IGUAL

;



function_defun: DEFINE VAR COM arg_list \\':\\' function_def \\'.\\'

 | DEFINE VAR \\':\\' function_def \\'.\\'

;



arg_list: VAR

| VAR \\',\\' arg_list

;



function_call: VAR COM call_arg_list

| VAR

;



call_arg_list: test_type

| test_type \\',\\' call_arg_list

;





%%

int main()

{

//line = 1;



yyparse();

}



void yyerror (char *s)

{

printf("%sn", s);

}

Há um problema k ainda não foi resolvido na parte de design do código, que descobri enquanto estava a começar a criar o aceitador de linguagem. Falta definir como terminam as expressões. Por exemplo, em C, tudo acaba com o famoso \\';\\'. Nesta linguagem tb vamos precisar de um caracter/símbolo terminal para cada uma das linhas, e não pode ser um \\'.\\'

Alguma ideia?


Ainda é possível utilizar as vírgulas desta forma:

Se xxx, faz_isto, faz_akilo, etc.
Ou se yyy, faz_akilo, faz_isto, etc.
Senao, faz_outra_coisa_kk.

Mas todo o código teria k ser terminado com uma vírgula, excepto os que terminam em \\'.\\':

@var = \\"Olá!\\",
@test = 5,

Se @test < 10, mostra @var.


Ok. A seguir... faltam ciclos. Como querem implementá-los?

FAZ ... ATÉ?
ENQUANTO?
REPETE?

Dpois arranjo tempo para os próximos 5 min de código
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

Teotónio Ricardo

Pode-se usar a \\",\\" ou um #, mas a ideia da virgula é mais facil.

De resto acho que ficaria assim:
FAZ ... ATE?
ENQUANTO?
REPETIR?


KTachyon

WPL.l
%{

#include "y.tab.h"

#include

#include

%}



%%

"//".*n {/*line++*/;}



"-"?[0-9]+ {yylval.inteiro = atoi(yytext); return INTEIRO;}

"-"?[0-9]+"."[0-9]+ {yylval.nint = atof(yytext); return FLOAT;}

""".""" {yylval.str = (char*) strdup(yytext);}



"@"[a-zA-Z0-9-_]* {yylval.var = (char*) strdup(yytext); return VAR;}



"SE" {return SE;}

"OU SE" {return OU_SE;}

"SENÃÆ'O" {return SENAO;}



"DEFINE" {return DEFINE;}

"COM" {return COM;}

"RETORNA" {return RETORNA;}



"FAZ" {return FAZ;}

"ATÉ" {return ATE;}

"REPETE" {return REPETE;}

"ENQUANTO" {return ENQUANTO;}



"=" {return IGUAL;}

">" {return MAIOR;}

"<" {return MENOR;}

"<=" {return MENOR_IGUAL;}

">=" {return MAIOR_IGUAL;}



"+" {return SOMA;}

"-" {return SUBT;}

"*" {return MULT;}

"/" {return DIVI;}



[ t] ;



n {/*line++*/;}



. return yytext[0];

%%

int yywrap()

{

return 1;

}

WPL.y
%{

#include

#include

%}

%token INTEGER

%token FLOAT

%token STRING

%token VAR



%token SE

%token OU_SE

%token SENAO



%token DEFINE

%token COM

%token RETORNA



%token FAZ

%token ATE

%token REPETE

%token ENQUANTO



%token IGUAL

%token MAIOR

%token MENOR

%token MENOR_IGUAL

%token MAIOR_IGUAL



%token SOMA

%token SUBT

%token MULT

%token DIVI



%union{

int inteiro;

char *str;

float nint;

char *var;

}



%%



statement: codeline

| statement codeline

;



codelines: codeline

| codeline codelines

;



codeline: function_if

| function_defun

| function_call

| attrib

| cicle_until

| cicle_while

| cicle_dotimes

;



attrib: VAR IGUAL expression

;



expression: STRING

 | simple_type oper simple_type

;



oper: SOMA

| SUBT

| MULT

| DIVI

;



function_if: SE testcond \\',\\' codelines \\'.\\'

  | SE testcond \\',\\' codelines \\'.\\' cicle_else_if

  | SE testcond \\',\\' codelines \\'.\\' cicle_else_if SENAO \\',\\' codelines \\'.\\'

  | SE testcond \\',\\' codelines \\'.\\' SENAO \\',\\' codelines \\'.\\'

 ;



cicle_else_if: OU_SE testcond \\',\\' codelines \\'.\\'

| cicle_else_if OU_SE testcond \\',\\' codelines \\'.\\'

;



testcond: simple_type

| simple_type test_oper simple_type

;



simple_type: INTEGER

  | FLOAT

  | VAR

 ;



returnable_type: INTEGER

  | FLOAT

  | VAR

  | STRING

 ;



test_oper: IGUAL

| MAIOR

| MENOR

| MAIOR_IGUAL

| MENOR_IGUAL

;



function_defun: DEFINE VAR COM arg_list \\':\\' function_def \\'.\\'

 | DEFINE VAR \\':\\' function_def \\'.\\'

;



function_def: codelines

| RETORNA returnable_type

| function_def codelines

| function_def RETORNA returnable_type

;



arg_list: VAR

| VAR \\',\\' arg_list

;



function_call: VAR COM call_arg_list

| VAR

;



call_arg_list: returnable_type

| returnable_type \\',\\' call_arg_list

;



cicle_until: FAZ codelines ATE testcond \\'.\\'

 ;



cicle_while: ENQUANTO testcond \\',\\' codelines \\'.\\'

 ;



cicle_dotimes: REPETE INTEGER \\':\\' codelines \\'.\\'

;





%%

int main()

{

//line = 1;



yyparse();

}



void yyerror (char *s)

{

printf("%sn", s);

}

A parte do YACC ainda tem 6 shift/reduce conflicts, mas estou no processo de os corrigir.
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

KTachyon

Estou de momento noutro projecto de criação de uma outra linguagem (diga-se de passagem, mais complexa, mas com menos utilidade) para uma das cadeiras, de forma a k o processo de criação desta linguagem vai continuar lento, a não ser k alguém com alguma experiência no assunto se junte para ajudar à criação da mesma. De kk forma, a minha cooperação vai continuar, mesmo lentamente.

P.S.: Aproveitei para actualizar a lista de contribuidores.
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32