Skip to content

Commit 00615b6

Browse files
committed
Added a workarround for Portugol with objects, now methods are just functions with the first parameter informing which object is being called
1 parent 3e6967a commit 00615b6

File tree

4 files changed

+76
-19
lines changed

4 files changed

+76
-19
lines changed

examples/PT-Portugol/Melodia/Melodia.ino

+7-4
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,18 @@
2424
#include "notas.h"
2525

2626
// Declara o vetor de duracao das notas
27-
vetor(numerico(), duracaoNotas, 8, {
27+
vetor(numerico, duracaoNotas, 8, {
2828
4, 8, 8, 4, 4, 4, 4, 4
2929
})
3030

3131
// Declara o vetor da melodia
32-
vetor(numerico(), melodia, 8, {
32+
vetor(numerico, melodia, 8, {
3333
NOTA_C4, NOTA_G3, NOTA_G3, NOTA_A3, NOTA_G3, 0, NOTA_B3, NOTA_C4
3434
})
3535

36+
// Especifica o pino do alto falante
37+
numerico(pinoAltoFalante, 8)
38+
3639
// Configura o arduino
3740
configura
3841
inicio
@@ -48,7 +51,7 @@ inicio
4851
duracaoNota = 1000 / duracaoNotas[estaNota]
4952

5053
// Executa o tom pelo tempo definido
51-
tom(8, melodia[estaNota], duracaoNota)
54+
tom(pinoAltoFalante, melodia[estaNota], duracaoNota)
5255

5356
// Como o tom é executado em paralelo, para sentirmos a diferença entre as notas
5457
// iremos esperar por 30% do tempo a mais, porque funciona bem
@@ -57,7 +60,7 @@ inicio
5760
espera(pausaEntreNotas)
5861

5962
// Para de executar o som
60-
semTom(8)
63+
semTom(pinoAltoFalante)
6164

6265
fim
6366

keywords.txt

+17-1
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,32 @@ declare KEYWORD2
1313
espera KEYWORD2
1414
tom KEYWORD2
1515
semTom KEYWORD2
16+
limites KEYWORD2
17+
mapeie KEYWORD2
1618

1719
# Methods -- KEYWORD2
1820
# ---------------------
1921
comecar KEYWORD2
22+
comeca KEYWORD2
2023
imprime KEYWORD2
24+
imprimir KEYWORD2
2125
imprimeln KEYWORD2
26+
imprimirlln KEYWORD2
27+
disponivel KEYWORD2
28+
ler KEYWORD2
29+
le KEYWORD2
30+
leCaractere KEYWORD2
31+
escrever KEYWORD2
32+
escreve KEYWORD2
2233

2334
# Datatypes -- RESERVED_WORD
2435
# ---------------------
2536
numerico RESERVED_WORD_2
2637
decimal RESERVED_WORD_2
38+
caractere RESERVED_WORD_2
2739
vetor RESERVED_WORD_2
2840
declare RESERVED_WORD_2
41+
constante RESERVED_WORD_2
2942

3043
# Reserved -- RESERVED_WORD
3144
# -------------------------
@@ -47,6 +60,9 @@ e RESERVED_WORD
4760
para RESERVED_WORD
4861
de RESERVED_WORD
4962
ate RESERVED_WORD
63+
ateCrescente RESERVED_WORD
64+
ateDecrescente RESERVED_WORD
65+
ateEm RESERVED_WORD
5066

5167
enquanto RESERVED_WORD
5268
faca RESERVED_WORD
@@ -92,4 +108,4 @@ keywordLITERAL2 LITERAL2
92108
keywordRESERVED_WORD RESERVED_WORD
93109
keywordRESERVED_WORD_2 RESERVED_WORD_2
94110
keywordDATA_TYPE DATA_TYPE
95-
keywordPREPROCESSOR PREPROCESSOR
111+
keywordPREPROCESSOR PREPROCESSOR

src/ArduinoLangPT_Portugol.h

+51-13
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
#define fim_algoritmo PREVENT_SEMICOLON_ERROR }
2222

2323
// Recreate lasso to apear more like portugol
24-
#define se PREVENT_SEMICOLON_ERROR if(
24+
#define se PREVENT_SEMICOLON_ERROR if(
2525
#define entao ){
2626
#define senaose PREVENT_SEMICOLON_ERROR } else if (
2727
#define senao PREVENT_SEMICOLON_ERROR } else {
@@ -41,24 +41,35 @@
4141
// Just types
4242
#define numerico0() int
4343
#define decimal0() float
44+
#define caractere0() char
45+
#define logico0() bool
4446

4547
// Redefine types
4648
#define declareType(_TYPE, _NAME) PREVENT_SEMICOLON_ERROR _TYPE _NAME;
4749
#define numerico1(_NAME) declareType(int, _NAME)
4850
#define decimal1(_NAME) declareType(float, _NAME)
49-
50-
// Vector Initialization
51-
#define vetor(_TYPE, _NAME, _SIZE, ...) PREVENT_SEMICOLON_ERROR _TYPE _NAME[_SIZE + 1] PREPEND_EQUAL_IF_NONEMPTY(__VA_ARGS__);
52-
//#define vetor(...) GET_MACRO(_, ##__VA_ARGS__, vetor4, vetor3, _, _, _)(__VA_ARGS__)
51+
#define caractere1(_NAME) declareType(char, _NAME)
52+
#define logico1(_NAME) declareType(bool, _NAME)
5353

5454
// Types with values
5555
#define declareTypeValue(_TYPE, _NAME, _VALUE) PREVENT_SEMICOLON_ERROR _TYPE _NAME = _VALUE;
5656
#define numerico2(_NAME, _VALUE) declareTypeValue(int, _NAME, _VALUE)
5757
#define decimal2(_NAME, _VALUE) declareTypeValue(float, _NAME, _VALUE)
58+
#define caractere2(_NAME, _VALUE) declareTypeValue(char, _NAME, _VALUE)
59+
#define logico2(_NAME, _VALUE) declareTypeValue(bool, _NAME, _VALUE)
5860

5961
// Overloaded declare functions
6062
#define numerico(...) GET_MACRO(_, ##__VA_ARGS__, _, _, numerico2, numerico1, numerico0)(__VA_ARGS__)
6163
#define decimal(...) GET_MACRO(_, ##__VA_ARGS__, _, _, decimal2, decimal1, decimal0)(__VA_ARGS__)
64+
#define caractere(...) GET_MACRO(_, ##__VA_ARGS__, _, _, caractere2, caractere1, caractere0)(__VA_ARGS__)
65+
#define logico(...) GET_MACRO(_, ##__VA_ARGS__, _, _, logico2, logico1, logico0)(__VA_ARGS__)
66+
67+
// Vector Initialization
68+
#define vetor(_TYPE, _NAME, _SIZE, ...) PREVENT_SEMICOLON_ERROR _TYPE() _NAME[_SIZE + 1] PREPEND_EQUAL_IF_NONEMPTY(__VA_ARGS__);
69+
//#define vetor(...) GET_MACRO(_, ##__VA_ARGS__, vetor4, vetor3, _, _, _)(__VA_ARGS__)
70+
71+
// Constantes
72+
#define constante(_TYPE, _NAME, _VALUE) PREVENT_SEMICOLON_ERROR _TYPE(const _NAME, _VALUE);
6273

6374
// And then the function to declare any number of vars
6475
#define declare(_TYPE, ...) PREVENT_SEMICOLON_ERROR CALL_MACRO_X_FOR_EACH(_TYPE, __VA_ARGS__)
@@ -69,8 +80,18 @@
6980

7081
// For in portugol style
7182
#define para PREVENT_SEMICOLON_ERROR for(
72-
#define de =
73-
#define ate(_X, _Y) ; _X <= _Y ; _X++
83+
#define de =
84+
85+
// Ate com e sem incremento crescente
86+
#define ateCrescente3(_X, _Y, _Z) ; _X <= _Y; _X += _Z
87+
#define ateCrescente2(_X, _Y) ateCrescente3(_X, _Y, 1)
88+
#define ateCrescente(...) GET_MACRO(_, ##__VA_ARGS__, _, ateCrescente3, ateCrescente2, _, _)(__VA_ARGS__)
89+
#define ate(...) ateCrescente(__VA_ARGS__)
90+
91+
// Ate com e sem incremento decrescente
92+
#define ateDecrescente3(_X, _Y, _Z) ; _X >= _Y; _X -= _Z
93+
#define ateDecrescente2(_X, _Y) ateDecrescente3(_X, _Y, 1)
94+
#define ateDecrescente(...) GET_MACRO(_, ##__VA_ARGS__, _, ateDecrescente3, ateDecrescente2, _, _)(__VA_ARGS__)
7495

7596
// Basic arduino reserved function name
7697
#define configura void setup()
@@ -81,20 +102,37 @@
81102
#define escrevaDigital(_PIN, _STATE) PREVENT_SEMICOLON_ERROR digitalWrite(_PIN, _STATE);
82103
#define escrevaAnalogico(_PIN, _VALUE) PREVENT_SEMICOLON_ERROR analogWrite(_PIN, _VALUE);
83104
#define espera(_TIME) PREVENT_SEMICOLON_ERROR delay(_TIME);
84-
#define tom(_TIME, _NOTE, _DURATION) PREVENT_SEMICOLON_ERROR tone(_TIME, _NOTE, _DURATION);
85-
#define semTom(_TIME) PREVENT_SEMICOLON_ERROR noTone(_TIME);
105+
#define tom(_PIN, _NOTE, _DURATION) PREVENT_SEMICOLON_ERROR tone(_PIN, _NOTE, _DURATION);
106+
#define semTom(_PIN) PREVENT_SEMICOLON_ERROR noTone(_PIN);
107+
#define limites(_VAR, _MIN, _MAX) PREVENT_SEMICOLON_ERROR constrain(_VAR, _MIN, _MAX);
108+
#define mapeie(_VAR, _MIN1, _MAX1, _MIN2, _MAX2) PREVENT_SEMICOLON_ERROR mapeie(_VAR, _MIN1, _MAX1, _MIN2, _MAX2)
86109

87110
// Basic functions with return
88111
#define leiaAnalogico(_PIN) analogRead(_PIN);
89112
#define leiaDigital(_PIN) digitalRead(_PIN);
90113

91-
// Methods
114+
// Methods as functions
92115
#define comecar begin
93-
#define imprime(_TEXT) println(_TEXT);
94-
#define imprimeln(_TEXT) print(_TEXT);
116+
#define comeca(_OBJECT, _SPEED) PREVENT_SEMICOLON_ERROR _OBJECT.begin(_SPEED);
117+
118+
#define imprimir print
119+
#define imprime(_OBJECT, _TEXT) PREVENT_SEMICOLON_ERROR _OBJECT.print(_TEXT);
120+
121+
#define imprimirln println
122+
#define imprimeln(_OBJECT, _TEXT) PREVENT_SEMICOLON_ERROR _OBJECT.println(_TEXT);
123+
124+
#define disponivel available()
125+
#define estaDisponivel(_OBJECT) _OBJECT.available();
126+
127+
#define ler read
128+
#define le(_OBJECT) _OBJECT.read();
129+
#define leCaractere le(Serial)
130+
131+
#define escrever(_OBJECT, _CHAR) PREVENT_SEMICOLON_ERROR _OBJECT.write(_CHAR);
132+
#define escreve write
95133

96134
// Avoid errors on objects
97-
#define Serial PREVENT_SEMICOLON_ERROR Serial
135+
//#define Serial PREVENT_SEMICOLON_ERROR Serial
98136

99137
// Constants
100138
#define ALTO HIGH

tests/preprocessor_limits.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ inicio
148148

149149
escreva("Enquanto de 1 ate 10")
150150
declare(numerico, i)
151-
i = 0
151+
i <- 0
152152
enquanto i < 10 faca
153153
inicio
154154
escreva("Numero " variavel_numerica, i)

0 commit comments

Comments
 (0)