Skip to content

Instantly share code, notes, and snippets.

@Biazus
Created September 4, 2014 03:31
Show Gist options
  • Save Biazus/06ff4599df5c7768a689 to your computer and use it in GitHub Desktop.
Save Biazus/06ff4599df5c7768a689 to your computer and use it in GitHub Desktop.
comp
%{
#include <stdio.h>
#include <stdlib.h>
#include "hash.h"
extern int getLineNumber(void);
extern int isRunning(void);
%}
%union
{
HASH_NODE* symbol;
};
%right '='
%left OPERATOR_AND OPERATOR_OR
%nonassoc OPERATOR_LE OPERATOR_GE OPERATOR_EQ OPERATOR_NE '<' '>'
%left '+' '-'
%left '*' '/'
%token KW_WORD 256
%token KW_BOOL 258
%token KW_BYTE 259
%token KW_IF 261
%token KW_THEN 262
%token KW_ELSE 263
%token KW_LOOP 264
%token KW_INPUT 266
%token KW_RETURN 267
%token KW_OUTPUT 268
%token OPERATOR_LE 270
%token OPERATOR_GE 271
%token OPERATOR_EQ 272
%token OPERATOR_NE 273
%token OPERATOR_AND 274
%token OPERATOR_OR 275
%token<symbol> SYMBOL_UNDEFINED 0
%token<symbol> SYMBOL_LIT_INTEGER 1
%token<symbol> SYMBOL_LIT_FLOATING 2
%token<symbol> SYMBOL_LIT_TRUE 3
%token<symbol> SYMBOL_LIT_FALSE 4
%token<symbol> SYMBOL_LIT_CHAR 5
%token<symbol> SYMBOL_LIT_STRING 6
%token<symbol> SYMBOL_IDENTIFIER 7
%token TOKEN_ERROR 290
%%
program: decl_global program
|
;
decl_global: decl_var ';'
| decl_array ';'
| decl_func
;
decl_var: data_type SYMBOL_IDENTIFIER ':' value
;
decl_array: data_type SYMBOL_IDENTIFIER '[' expr ']'
| data_type SYMBOL_IDENTIFIER '[' expr ']' ':' vetor_value
| data_type '$' SYMBOL_IDENTIFIER
| data_type '$' SYMBOL_IDENTIFIER ':' value
;
decl_local: decl_var
| decl_var ';' decl_local
|
;
vetor_value: value
| value vetor_value
;
decl_func: data_type SYMBOL_IDENTIFIER '(' parameters ')' decl_local block
| data_type SYMBOL_IDENTIFIER '(' parameters ')' decl_local commands
;
parameters: data_type SYMBOL_IDENTIFIER
| data_type SYMBOL_IDENTIFIER ',' parameters
|
;
block: '{' commands '}' ';'
| '{' '}' ';'
;
commands: command ';' commands
|
;
block_ctrl: command
;
command: SYMBOL_IDENTIFIER '=' expr
| SYMBOL_IDENTIFIER '[' expr ']' '=' expr
| KW_OUTPUT output
| KW_INPUT SYMBOL_IDENTIFIER
| KW_RETURN expr
| flux_control
| block
;
output: expr
| expr ',' output
;
flux_control: KW_LOOP '(' expr ')' '{' block_ctrl '}'
| KW_LOOP command ';'
| KW_IF '(' expr ')' KW_THEN '{' commands '}'
| KW_IF command ';'
| KW_IF '(' expr ')' KW_THEN '{' block_ctrl KW_ELSE block_ctrl '}'
| KW_IF '(' expr ')' KW_ELSE command
;
expr: SYMBOL_IDENTIFIER
| SYMBOL_IDENTIFIER '[' expr ']'
| SYMBOL_IDENTIFIER '(' param_func ')'
| value
| '(' expr ')'
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| expr OPERATOR_AND expr
| expr OPERATOR_OR expr
| expr OPERATOR_LE expr
| expr OPERATOR_GE expr
| expr OPERATOR_EQ expr
| expr OPERATOR_NE expr
| expr '<' expr
| expr '>' expr
| '*' SYMBOL_IDENTIFIER
| '&' SYMBOL_IDENTIFIER
;
param_func: SYMBOL_IDENTIFIER
| SYMBOL_IDENTIFIER ',' param_func
| value
| value ',' param_func
|
;
data_type: KW_WORD
| KW_BYTE
| KW_BOOL
;
value: SYMBOL_LIT_INTEGER
| SYMBOL_LIT_TRUE
| SYMBOL_LIT_FALSE
| SYMBOL_LIT_CHAR
| SYMBOL_LIT_STRING
;
%%
int yyerror(char* str)
{
fflush(stderr);
fprintf(stderr,"ERRO: \"%s\"\t Linha: %d\n", str, getLineNumber());
exit(3);
//fprintf(stderr, "syntax error. \n");
//exit(3);
}
@phpmorales
Copy link

%{

include <stdio.h>

include <stdlib.h>

include "hash.h"

extern int getLineNumber(void);
extern int isRunning(void);

%}

%union
{
HASH_NODE* symbol;
};

%right '='
%left OPERATOR_AND OPERATOR_OR
%nonassoc OPERATOR_LE OPERATOR_GE OPERATOR_EQ OPERATOR_NE '<' '>'
%left '+' '-'
%left '*' '/'

%token KW_WORD 256
%token KW_BOOL 258
%token KW_BYTE 259
%token KW_IF 261
%token KW_THEN 262
%token KW_ELSE 263
%token KW_LOOP 264
%token KW_INPUT 266
%token KW_RETURN 267
%token KW_OUTPUT 268

%token OPERATOR_LE 270
%token OPERATOR_GE 271
%token OPERATOR_EQ 272
%token OPERATOR_NE 273
%token OPERATOR_AND 274
%token OPERATOR_OR 275

%token SYMBOL_UNDEFINED 0
%token SYMBOL_LIT_INTEGER 1
%token SYMBOL_LIT_FLOATING 2
%token SYMBOL_LIT_TRUE 3
%token SYMBOL_LIT_FALSE 4
%token SYMBOL_LIT_CHAR 5
%token SYMBOL_LIT_STRING 6
%token SYMBOL_IDENTIFIER 7

%token TOKEN_ERROR 290

%%

program: decl_global program
|
;

decl_global: decl_var ';'
| decl_array ';'
| decl_func
;

decl_var: data_type SYMBOL_IDENTIFIER ':' value
;

decl_array: data_type SYMBOL_IDENTIFIER '[' expr ']'
| data_type SYMBOL_IDENTIFIER '[' expr ']' ':' vetor_value
| data_type '$' SYMBOL_IDENTIFIER
| data_type '$' SYMBOL_IDENTIFIER ':' value
;

decl_local: decl_var
| decl_var ';' decl_local
|
;

vetor_value: value
| value vetor_value
;

decl_func: data_type SYMBOL_IDENTIFIER '(' parameters ')' decl_local block
| data_type SYMBOL_IDENTIFIER '(' parameters ')' decl_local commands
;

parameters: data_type SYMBOL_IDENTIFIER
| data_type SYMBOL_IDENTIFIER ',' parameters
|
;

block: '{' commands '}' ';'
| '{' '}' ';'
;

commands: command ';' commands
|
;

block_ctrl: command
;

command: SYMBOL_IDENTIFIER '=' expr
| SYMBOL_IDENTIFIER '[' expr ']' '=' expr
| KW_OUTPUT output
| KW_INPUT SYMBOL_IDENTIFIER
| KW_RETURN expr
| flux_control
| block
;

output: expr
| expr ',' output
;

flux_control: KW_LOOP '(' expr ')' '{' block_ctrl '}'
| KW_LOOP command ';'
| KW_IF '(' expr ')' KW_THEN '{' commands '}'
| KW_IF command ';'
| KW_IF '(' expr ')' KW_THEN '{' block_ctrl KW_ELSE block_ctrl '}'
| KW_IF '(' expr ')' KW_ELSE command
;

expr: SYMBOL_IDENTIFIER
| SYMBOL_IDENTIFIER '[' expr ']'
| SYMBOL_IDENTIFIER '(' param_func ')'
| value
| '(' expr ')'
| expr '+' expr
| expr '-' expr
| expr '' expr
| expr '/' expr
| expr OPERATOR_AND expr
| expr OPERATOR_OR expr
| expr OPERATOR_LE expr
| expr OPERATOR_GE expr
| expr OPERATOR_EQ expr
| expr OPERATOR_NE expr
| expr '<' expr
| expr '>' expr
| '
' SYMBOL_IDENTIFIER
| '&' SYMBOL_IDENTIFIER
;

param_func: SYMBOL_IDENTIFIER
| SYMBOL_IDENTIFIER ',' param_func
| value
| value ',' param_func
|
;

data_type: KW_WORD
| KW_BYTE
| KW_BOOL
;

value: SYMBOL_LIT_INTEGER
| SYMBOL_LIT_TRUE
| SYMBOL_LIT_FALSE
| SYMBOL_LIT_CHAR
| SYMBOL_LIT_STRING
;

%%

int yyerror(char* str)
{
fflush(stderr);
fprintf(stderr,"ERRO: "%s"\t Linha: %d\n", str, getLineNumber());
exit(3);

//fprintf(stderr, "syntax error. \n");
//exit(3);

}

@phpmorales
Copy link

// UFRGS - Compiladores - Marcelo Johann - 2014/2

word 1a:0;
word 1v[10]:0 0 0 0 0 0 0 0 0 0;
word 1mat[1000];
word $1pt:0;

word 1incn (word 1x, word 1n)
return 1x+1n;

word 1outra (word 1x, word 1n)
{
output "Digite um numero: ";
if (1x < 1n) then { return 1x+1n; };
if (1x < 1n) else return 1x;
output "Incrementado algumas vezes fica ",1a,"\n";
};

word 1maisuma ()
{
};

word 1main()
{
// if (1i<10)
// loop
// {
1a = 1incn(1a,1);
1i = 1i + 1;
// };
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment