First commit
This commit is contained in:
commit
3d68783535
25 files changed
+1751
No files matched your search
@@ -0,0 +1,19 @@
|
||||
#ifndef MICROPASCAL_LEXER_LEXER_H
|
||||
#define MICROPASCAL_LEXER_LEXER_H
|
||||
|
||||
#include "micropascal-lexer/token.h"
|
||||
|
||||
typedef struct Lexer {
|
||||
const char* fonte;
|
||||
size_t tamanho;
|
||||
size_t posicao;
|
||||
int linha;
|
||||
int coluna;
|
||||
int houve_erro;
|
||||
} Lexer;
|
||||
|
||||
void lexerInicializar(Lexer* lexer, const char* fonte);
|
||||
Token lexerProximoToken(Lexer* lexer);
|
||||
void tokenLiberar(Token* token);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,60 @@
|
||||
#ifndef MICROPASCAL_LEXER_TOKEN_H
|
||||
#define MICROPASCAL_LEXER_TOKEN_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef enum TokenKind {
|
||||
TOKEN_EOF,
|
||||
TOKEN_IDENTIFICADOR,
|
||||
TOKEN_INTEIRO_LITERAL,
|
||||
TOKEN_REAL_LITERAL,
|
||||
TOKEN_CHAR_LITERAL,
|
||||
TOKEN_MENOR,
|
||||
TOKEN_MAIOR,
|
||||
TOKEN_MENOR_IGUAL,
|
||||
TOKEN_MAIOR_IGUAL,
|
||||
TOKEN_IGUAL,
|
||||
TOKEN_DIFERENTE,
|
||||
TOKEN_MAIS,
|
||||
TOKEN_MENOS,
|
||||
TOKEN_MULTIPLICACAO,
|
||||
TOKEN_DIVISAO,
|
||||
TOKEN_DIV,
|
||||
TOKEN_AND,
|
||||
TOKEN_OR,
|
||||
TOKEN_NOT,
|
||||
TOKEN_ATRIBUICAO,
|
||||
TOKEN_ABRE_PARENTESES,
|
||||
TOKEN_FECHA_PARENTESES,
|
||||
TOKEN_VIRGULA,
|
||||
TOKEN_PONTO_VIRGULA,
|
||||
TOKEN_PONTO,
|
||||
TOKEN_DOIS_PONTOS,
|
||||
TOKEN_PROGRAM,
|
||||
TOKEN_IF,
|
||||
TOKEN_THEN,
|
||||
TOKEN_ELSE,
|
||||
TOKEN_WHILE,
|
||||
TOKEN_DO,
|
||||
TOKEN_REPEAT,
|
||||
TOKEN_UNTIL,
|
||||
TOKEN_INTEGER,
|
||||
TOKEN_REAL,
|
||||
TOKEN_CHAR,
|
||||
TOKEN_BEGIN,
|
||||
TOKEN_END,
|
||||
TOKEN_WRITE,
|
||||
TOKEN_VAR,
|
||||
TOKEN_ERRO
|
||||
} TokenKind;
|
||||
|
||||
typedef struct Token {
|
||||
TokenKind kind;
|
||||
char* lexema;
|
||||
int linha;
|
||||
int coluna;
|
||||
} Token;
|
||||
|
||||
const char* tokenKindNome(TokenKind kind);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
#ifndef MICROPASCAL_PARSER_AST_H
|
||||
#define MICROPASCAL_PARSER_AST_H
|
||||
|
||||
typedef enum AstKind {
|
||||
AST_PROGRAMA,
|
||||
AST_SECAO_VAR,
|
||||
AST_DECL_VAR,
|
||||
AST_TIPO,
|
||||
AST_BLOCO,
|
||||
AST_LISTA_COMANDOS,
|
||||
AST_ATRIBUICAO,
|
||||
AST_ITERACAO,
|
||||
AST_DECISAO,
|
||||
AST_ESCRITA,
|
||||
AST_EXPRESSAO_BINARIA,
|
||||
AST_EXPRESSAO_UNARIA,
|
||||
AST_EXPRESSAO_PARENTESES,
|
||||
AST_EXPRESSAO_LITERAL,
|
||||
AST_EXPRESSAO_IDENTIFICADOR
|
||||
} AstKind;
|
||||
|
||||
typedef struct AstNo {
|
||||
AstKind kind;
|
||||
char* valor;
|
||||
struct AstNo* esquerda;
|
||||
struct AstNo* direita;
|
||||
struct AstNo* terceiro;
|
||||
struct AstNo* proximo;
|
||||
} AstNo;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
#ifndef MICROPASCAL_PARSER_PARSER_H
|
||||
#define MICROPASCAL_PARSER_PARSER_H
|
||||
|
||||
#include "micropascal-lexer/lexer.h"
|
||||
#include "micropascal-parser/ast.h"
|
||||
|
||||
typedef struct Parser {
|
||||
Lexer* lexer;
|
||||
Token atual;
|
||||
int houve_erro;
|
||||
int total_erros;
|
||||
int silencioso;
|
||||
} Parser;
|
||||
|
||||
void parserInicializar(Parser* parser, Lexer* lexer);
|
||||
void parserSilenciarErros(Parser* parser, int silenciar);
|
||||
AstNo* parserAnalisarPrograma(Parser* parser);
|
||||
void astLiberar(AstNo* no);
|
||||
void astImprimir(const AstNo* no, int profundidade);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,26 @@
|
||||
#ifndef MICROPASCAL_TESTS_TESTES_H
|
||||
#define MICROPASCAL_TESTS_TESTES_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
typedef struct ResultadoTeste {
|
||||
int total;
|
||||
int passaram;
|
||||
int falharam;
|
||||
} ResultadoTeste;
|
||||
|
||||
void runLexerTests(ResultadoTeste* resultado_testes);
|
||||
void runParserTests(ResultadoTeste* resultado_testes);
|
||||
|
||||
#define TESTE_ASSERT(resultado_testes, condicao, descricao) \
|
||||
do { \
|
||||
(resultado_testes)->total++; \
|
||||
if (condicao) { \
|
||||
(resultado_testes)->passaram++; \
|
||||
} else { \
|
||||
(resultado_testes)->falharam++; \
|
||||
printf("FALHOU: %s (linha %d)\n", descricao, __LINE__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user