From 8c65fe71cf2c92c6ea808c7c8cc6f694e6b2baf1 Mon Sep 17 00:00:00 2001 From: User <> Date: Thu, 7 Feb 2019 01:55:06 +0100 Subject: [PATCH] added lexer for Core language, removed Eclipse/VSCode settings --- .project | 2 +- .settings/org.eclipse.core.resources.prefs | 2 - .settings/org.eclipse.jdt.apt.core.prefs | 2 - .settings/org.eclipse.jdt.core.prefs | 14 --- .settings/org.eclipse.m2e.core.prefs | 4 - .vscode/settings.json | 3 - build.xml | 14 ++- src/pp/iloc/Simulator.java | 1 - src/pp/s1184725/boppi/BoppiCoreChecker.java | 114 ++++++++++++++++++ src/pp/s1184725/boppi/antlr/BoppiCore.g4 | 34 ++++++ .../s1184725/boppi/antlr/BoppiCoreTokens.g4 | 23 ++++ src/pp/s1184725/boppi/test/test1.core | 1 + src/pp/s1184725/boppi/test/test2.core | 12 ++ 13 files changed, 198 insertions(+), 28 deletions(-) delete mode 100644 .settings/org.eclipse.core.resources.prefs delete mode 100644 .settings/org.eclipse.jdt.apt.core.prefs delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.m2e.core.prefs delete mode 100644 .vscode/settings.json create mode 100644 src/pp/s1184725/boppi/BoppiCoreChecker.java create mode 100644 src/pp/s1184725/boppi/test/test1.core create mode 100644 src/pp/s1184725/boppi/test/test2.core diff --git a/.project b/.project index 918a6d8..0a71914 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - boppi + boppi2 diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs deleted file mode 100644 index d4313d4..0000000 --- a/.settings/org.eclipse.jdt.apt.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index ff1c9b8..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,14 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.processAnnotations=disabled -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 0e14d8e..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "java.configuration.updateBuildConfiguration": "disabled" -} \ No newline at end of file diff --git a/build.xml b/build.xml index 3af1109..5d2cb03 100644 --- a/build.xml +++ b/build.xml @@ -1,5 +1,5 @@ - + @@ -106,6 +106,18 @@ + + + + + + + + + + + + diff --git a/src/pp/iloc/Simulator.java b/src/pp/iloc/Simulator.java index 3f15a21..d864a16 100644 --- a/src/pp/iloc/Simulator.java +++ b/src/pp/iloc/Simulator.java @@ -13,7 +13,6 @@ import pp.iloc.model.Num; import pp.iloc.model.Op; import pp.iloc.model.OpClaz; import pp.iloc.model.OpCode; -import pp.iloc.model.Operand.Type; import pp.iloc.model.Program; import pp.iloc.parse.FormatException; diff --git a/src/pp/s1184725/boppi/BoppiCoreChecker.java b/src/pp/s1184725/boppi/BoppiCoreChecker.java new file mode 100644 index 0000000..b6a161c --- /dev/null +++ b/src/pp/s1184725/boppi/BoppiCoreChecker.java @@ -0,0 +1,114 @@ +package pp.s1184725.boppi; + +import java.util.logging.Logger; +import java.util.stream.Collectors; + +import org.antlr.runtime.ANTLRFileStream; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.ParseTreeWalker; + +import pp.s1184725.boppi.antlr.*; +import pp.s1184725.boppi.antlr.BoppiCoreParser.*; +import pp.s1184725.boppi.exception.*; +import pp.s1184725.boppi.type.*; + +/** + * This class performs type checking and variable assignment on a bare parse + * tree. + * + * @author Frank Wibbelink + */ +public class BoppiCoreChecker extends BoppiCoreBaseListener { + public static void main(String[] args) { + BoppiCoreLexer lexer = new BoppiCoreLexer(ToolChain.getCharStream(BoppiCoreChecker.class, "test/test2.core")); + BoppiCoreParser parser = new BoppiCoreParser(new CommonTokenStream(lexer)); + ParseTree ast = parser.program(); + Logger logger = Logger.getLogger("TEST"); + Annotations annotations = checkProgram(ast, logger); + System.out.println(ToolChain.getAnnotatedDOT(ast, annotations)); + } + + private Annotations an; + private Logger log; + + /** + * Checks and annotates a program. Problems are reported to the given + * logger. + * + * @param ast + * the program's AST + * @param logger + * the logger object to write warnings and errors to + * @return the generated annotations + */ + public static Annotations checkProgram(ParseTree ast, Logger logger) { + BoppiCoreChecker checker = new BoppiCoreChecker(logger, new Annotations()); + ParseTreeWalker walker = new ParseTreeWalker(); + walker.walk(checker, ast); + return checker.an; + } + + protected BoppiCoreChecker(Logger logger, Annotations annotations) { + an = annotations; + log = logger; + } + + /** + * Checks whether two types are compatible and log an error if they do not. + * + * @param type1 + * the left hand or actual type + * @param type2 + * the right hand or desired type + * @param node + * the context used for logging + */ + private void checkConstraint(Type type1, Type type2, ParserRuleContext node) { + if (!type2.equals(type1)) + log.severe(getError(node, Messages.getString("BoppiChecker.0"), type1.toString(), type2.toString())); //$NON-NLS-1$ + } + + /** + * Returns an error message for a given parse tree node. + * + * @param ctx + * the parse tree node at which the error occurred + * @param message + * the error message + * @param args + * arguments for the message, see {@link String#format} + */ + private String getError(ParserRuleContext node, String message, Object... args) { + int line = node.getStart().getLine(); + int column = node.getStart().getCharPositionInLine(); + return String.format(Messages.getString("BoppiChecker.1"), line, column, String.format(message, args)); //$NON-NLS-1$ + } + + /** + * Returns whether the current context resides within a given rule context + * within a set root (may be {@code null}). Effectively traverses between + * {@code current} and {@code root} in the parent hierarchy looking for a + * {@code rule} class. + * + * @param + * the rule class + * @param ctx + * the node to start traversing + * @param root + * the node to stop traversing + * @param rule + * the ParserRuleContext class to look for + * @return whether a matching rule is found between the current and root + * node + */ + private boolean isWithinRule(ParserRuleContext ctx, ParserRuleContext root, + Class rule) { + for (ParserRuleContext node = ctx; node != root && node != null; node = node.getParent()) + if (node.getClass().isAssignableFrom(rule)) + return true; + + return false; + } +} diff --git a/src/pp/s1184725/boppi/antlr/BoppiCore.g4 b/src/pp/s1184725/boppi/antlr/BoppiCore.g4 index e69de29..b0063dd 100644 --- a/src/pp/s1184725/boppi/antlr/BoppiCore.g4 +++ b/src/pp/s1184725/boppi/antlr/BoppiCore.g4 @@ -0,0 +1,34 @@ +grammar BoppiCore; +import BoppiCoreTokens; + +program: expr EOF; + +block: BLOCKOPEN ((data|let) DELIM)+ BLOCKCLOSE; + +data: DATA id EQUALS BLOCKOPEN (id DELIM)+ BLOCKCLOSE; + +let: LET id EQUALS expr; + +id: IDENTIFIER (HASTYPE aexpr)?; + +expr + : expr expr #eApp + | LAMBDA id expr #eAbs + | PI id expr #eQuant + | block expr #eDecl + | CASE aexpr BLOCKOPEN (alt DELIM)+ BLOCKCLOSE #eCase + | aexpr #eSimple + ; + +alt: id TO expr; + +aexpr + : id + | literal + | PAROPEN expr PARCLOSE + ; + +literal + : LITERALINT + | LITERALCHAR + ; diff --git a/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4 b/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4 index e69de29..cbb5aac 100644 --- a/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4 +++ b/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4 @@ -0,0 +1,23 @@ +lexer grammar BoppiCoreTokens; + +DELIM: ';'; +HASTYPE: ':'; +LAMBDA: '\u03BB'; +PI: '\u03A0'; +PAROPEN: '('; +PARCLOSE: ')'; +DATA: 'data'; +LET: 'let'; +IN: 'in'; +CASE: 'case'; +TO: '\u2192'; +EQUALS: '='; +BLOCKOPEN: '{'; +BLOCKCLOSE: '}'; +LITERALINT: '0' | [1-9][0-9]*; +LITERALCHAR: '\'' . '\''; + +IDENTIFIER: [\p{Alphabetic}]+ | '_' | '\u2605'; + +WHITESPACE: [\p{White_Space}] -> skip; +BLOCKCOMMENT: '/*' .*? '*/' -> skip; diff --git a/src/pp/s1184725/boppi/test/test1.core b/src/pp/s1184725/boppi/test/test1.core new file mode 100644 index 0000000..7813681 --- /dev/null +++ b/src/pp/s1184725/boppi/test/test1.core @@ -0,0 +1 @@ +5 \ No newline at end of file diff --git a/src/pp/s1184725/boppi/test/test2.core b/src/pp/s1184725/boppi/test/test2.core new file mode 100644 index 0000000..af5b3b0 --- /dev/null +++ b/src/pp/s1184725/boppi/test/test2.core @@ -0,0 +1,12 @@ +{ + data Boolean:★ = { + True; + False; + }; + data List:(Π _:★ ★) = { + Cons : (Π a:★ Π _:a Π _:(List a) List a); + Nil : (Π a:★ List a); + }; + let main = True; +} +main \ No newline at end of file