some main program changes
This commit is contained in:
@ -2,10 +2,11 @@ import lexer.StupsLexer;
|
||||
import org.antlr.v4.runtime.CharStreams;
|
||||
import org.antlr.v4.runtime.Lexer;
|
||||
import parser.StupsParser;
|
||||
import parser.ast.AST;
|
||||
import parser.grammar.Grammar;
|
||||
import typechecker.TypeChecker;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
@ -43,16 +44,20 @@ public final class StupsCompiler {
|
||||
|
||||
Grammar grammar;
|
||||
try {
|
||||
Path grammarFile = Paths.get(StupsCompiler.class.getResource("Grammar.grammar").toURI());
|
||||
Path grammarFile = Paths.get(System.getProperty("user.dir") + "/stups.grammar");
|
||||
grammar = Grammar.fromFile(grammarFile);
|
||||
} catch (IOException | URISyntaxException e) {
|
||||
} catch (IOException e) {
|
||||
System.out.println("Die Grammatik konnte nicht geöffnet werden.");
|
||||
return;
|
||||
}
|
||||
|
||||
StupsParser stupsParser = StupsParser.fromGrammar(grammar);
|
||||
|
||||
stupsParser.parse(lexer.getAllTokens(), lexer.getVocabulary());
|
||||
AST tree = stupsParser.parse(lexer.getAllTokens(), lexer.getVocabulary());
|
||||
|
||||
tree.postprocess(grammar);
|
||||
|
||||
TypeChecker.validate(tree);
|
||||
|
||||
System.out.println("Compilation completed.");
|
||||
}
|
||||
|
71
stups.grammar
Normal file
71
stups.grammar
Normal file
@ -0,0 +1,71 @@
|
||||
START: S
|
||||
EPS: epsilon
|
||||
|
||||
// Structures:
|
||||
NTERM: VAL TYPE
|
||||
NTERM: OP UNARY ARITH_OP LOGIC_OP COMPARE_OP
|
||||
NTERM: S CLASS_CNT BLOCK_CNT
|
||||
NTERM: STATEMENT STMT PRINT
|
||||
NTERM: DECLARATION ASSIGNMENT
|
||||
NTERM: PAR_EXPR EXPR EXPR_2 EXPR_F
|
||||
NTERM: LOOP COND COND_ELSE SINGLE_OR_BRACED
|
||||
|
||||
// Token:
|
||||
TERM: CLASS PUBLIC STATIC
|
||||
TERM: STRING_TYPE INTEGER_TYPE BOOLEAN_TYPE VOID_TYPE
|
||||
TERM: WHILE IF ELSE
|
||||
TERM: PRINTLN
|
||||
TERM: ADD MUL SUB DIV MOD
|
||||
TERM: AND OR NOT
|
||||
TERM: LESS LESS_EQUAL GREATER GREATER_EQUAL EQUAL NOT_EQUAL
|
||||
TERM: ASSIGN
|
||||
TERM: L_BRACE R_BRACE L_BRACKET R_BRACKET L_PAREN R_PAREN SEMICOLON COMMA DOT
|
||||
TERM: INTEGER_LIT STRING_LIT BOOLEAN_LIT
|
||||
TERM: IDENTIFIER IDENTIFIER_MAIN
|
||||
|
||||
// Actions: compact - Value hochreichen
|
||||
// nullable - Kann entfernt werden, wenn keine value und keine children
|
||||
|
||||
// General -----------------------------------------------------------------------------------------
|
||||
|
||||
VAL[compact] -> INTEGER_LIT | STRING_LIT | BOOLEAN_LIT | IDENTIFIER
|
||||
TYPE[compact] -> INTEGER_TYPE | STRING_TYPE | BOOLEAN_TYPE
|
||||
|
||||
OP[compact] -> ARITH_OP | LOGIC_OP | COMPARE_OP
|
||||
UNARY[compact] -> ADD | SUB | NOT
|
||||
ARITH_OP[compact] -> ADD | SUB | MUL | DIV | MOD
|
||||
LOGIC_OP[compact] -> AND | OR | NOT
|
||||
COMPARE_OP[compact] -> LESS | LESS_EQUAL | GREATER | GREATER_EQUAL | EQUAL | NOT_EQUAL
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
|
||||
// class IDENTIFIER { CLASS_CNT }
|
||||
S[compact] -> CLASS IDENTIFIER L_BRACE CLASS_CNT R_BRACE | EPS
|
||||
|
||||
// public static void main(String[] args) { BLOCK_CNT }
|
||||
CLASS_CNT -> PUBLIC STATIC VOID_TYPE IDENTIFIER_MAIN L_PAREN STRING_TYPE L_BRACKET R_BRACKET IDENTIFIER R_PAREN L_BRACE BLOCK_CNT R_BRACE
|
||||
CLASS_CNT[compact nullable] -> EPS
|
||||
|
||||
// Stuff in {}
|
||||
BLOCK_CNT[compact nullable] -> STATEMENT BLOCK_CNT | L_BRACE BLOCK_CNT R_BRACE | EPS
|
||||
|
||||
STATEMENT -> STMT SEMICOLON
|
||||
STATEMENT[compact] -> LOOP | COND
|
||||
STMT[compact] -> PRINT | DECLARATION | ASSIGNMENT
|
||||
PRINT -> PRINTLN PAR_EXPR
|
||||
|
||||
// Declaration with Assignment: TYPE IDENTIFIER = LITERAL;
|
||||
DECLARATION -> TYPE ASSIGNMENT
|
||||
ASSIGNMENT -> IDENTIFIER ASSIGN EXPR
|
||||
|
||||
// Stuff that returns something
|
||||
PAR_EXPR -> L_PAREN EXPR R_PAREN
|
||||
EXPR[compact] -> EXPR_F EXPR_2
|
||||
EXPR_2[compact nullable] -> OP EXPR_F EXPR_2 | EPS
|
||||
EXPR_F[compact] -> UNARY EXPR_F | PAR_EXPR | VAL
|
||||
|
||||
// Control-Flow
|
||||
SINGLE_OR_BRACED -> L_BRACE BLOCK_CNT R_BRACE | STMT SEMICOLON
|
||||
LOOP -> WHILE PAR_EXPR SINGLE_OR_BRACED
|
||||
COND -> IF PAR_EXPR SINGLE_OR_BRACED COND_ELSE
|
||||
COND_ELSE[nullable] -> ELSE SINGLE_OR_BRACED | EPS
|
Reference in New Issue
Block a user