added lexer for Core language, removed Eclipse/VSCode settings
This commit is contained in:
parent
6718a77890
commit
8c65fe71cf
2
.project
2
.project
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<projectDescription>
|
<projectDescription>
|
||||||
<name>boppi</name>
|
<name>boppi2</name>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
<projects>
|
<projects>
|
||||||
</projects>
|
</projects>
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
eclipse.preferences.version=1
|
|
||||||
encoding/<project>=UTF-8
|
|
|
@ -1,2 +0,0 @@
|
||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.apt.aptEnabled=false
|
|
|
@ -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
|
|
|
@ -1,4 +0,0 @@
|
||||||
activeProfiles=
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
resolveWorkspaceProjects=true
|
|
||||||
version=1
|
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
"java.configuration.updateBuildConfiguration": "disabled"
|
|
||||||
}
|
|
14
build.xml
14
build.xml
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<project basedir="." name="boppi">
|
<project basedir="." name="boppi2">
|
||||||
<property environment="env" />
|
<property environment="env" />
|
||||||
<property name="junit.output.dir" value="doc/junit" />
|
<property name="junit.output.dir" value="doc/junit" />
|
||||||
<property name="g4.iloc" value="src/pp/iloc/parse" />
|
<property name="g4.iloc" value="src/pp/iloc/parse" />
|
||||||
|
@ -106,6 +106,18 @@
|
||||||
<arg value="-no-listener" />
|
<arg value="-no-listener" />
|
||||||
<arg value="-visitor" />
|
<arg value="-visitor" />
|
||||||
</java>
|
</java>
|
||||||
|
<java classname="org.antlr.v4.Tool">
|
||||||
|
<classpath>
|
||||||
|
<pathelement location="lib/antlr-4.7-complete.jar" />
|
||||||
|
</classpath>
|
||||||
|
<arg value="${g4.boppi}/BoppiCore.g4" />
|
||||||
|
<arg value="-o" />
|
||||||
|
<arg value="${g4.boppi}" />
|
||||||
|
<arg value="-package" />
|
||||||
|
<arg value="pp.s1184725.boppi.antlr" />
|
||||||
|
<arg value="-listener" />
|
||||||
|
<arg value="-no-visitor" />
|
||||||
|
</java>
|
||||||
<java classname="org.antlr.v4.Tool">
|
<java classname="org.antlr.v4.Tool">
|
||||||
<classpath>
|
<classpath>
|
||||||
<pathelement location="lib/antlr-4.7-complete.jar" />
|
<pathelement location="lib/antlr-4.7-complete.jar" />
|
||||||
|
|
|
@ -13,7 +13,6 @@ import pp.iloc.model.Num;
|
||||||
import pp.iloc.model.Op;
|
import pp.iloc.model.Op;
|
||||||
import pp.iloc.model.OpClaz;
|
import pp.iloc.model.OpClaz;
|
||||||
import pp.iloc.model.OpCode;
|
import pp.iloc.model.OpCode;
|
||||||
import pp.iloc.model.Operand.Type;
|
|
||||||
import pp.iloc.model.Program;
|
import pp.iloc.model.Program;
|
||||||
import pp.iloc.parse.FormatException;
|
import pp.iloc.parse.FormatException;
|
||||||
|
|
||||||
|
|
|
@ -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 <T>
|
||||||
|
* 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 <T extends ParserRuleContext> boolean isWithinRule(ParserRuleContext ctx, ParserRuleContext root,
|
||||||
|
Class<T> rule) {
|
||||||
|
for (ParserRuleContext node = ctx; node != root && node != null; node = node.getParent())
|
||||||
|
if (node.getClass().isAssignableFrom(rule))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
;
|
|
@ -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;
|
|
@ -0,0 +1 @@
|
||||||
|
5
|
|
@ -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
|
Loading…
Reference in New Issue