prettyprinter
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// Generated from /home/tuanvu/Desktop/M1/S8/PDS/tp2-vsl-pds/src/main/antlr/VSLLexer.g by ANTLR 4.13.1
|
||||
// Generated from c:/Users/Thibaut/Documents/Git/PDS/tp2-vsl-pds/src/main/antlr/VSLLexer.g by ANTLR 4.13.1
|
||||
|
||||
package TP2;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Generated from /home/tuanvu/Desktop/M1/S8/PDS/tp2-vsl-pds/src/main/antlr/VSLParser.g by ANTLR 4.13.1
|
||||
// Generated from c:/Users/Thibaut/Documents/Git/PDS/tp2-vsl-pds/src/main/antlr/VSLParser.g by ANTLR 4.13.1
|
||||
|
||||
package TP2;
|
||||
import TP2.asd.Program.*;
|
||||
|
||||
166
src/main/antlr/.antlr/VSLParserBaseListener.java
Normal file
166
src/main/antlr/.antlr/VSLParserBaseListener.java
Normal file
@@ -0,0 +1,166 @@
|
||||
// Generated from c:/Users/Thibaut/Documents/Git/PDS/tp2-vsl-pds/src/main/antlr/VSLParser.g by ANTLR 4.13.1
|
||||
|
||||
package TP2;
|
||||
import TP2.asd.Program.*;
|
||||
import TP2.asd.*;
|
||||
import TP2.asd.Interface.*;
|
||||
import TP2.asd.Eval.*;
|
||||
|
||||
|
||||
import org.antlr.v4.runtime.ParserRuleContext;
|
||||
import org.antlr.v4.runtime.tree.ErrorNode;
|
||||
import org.antlr.v4.runtime.tree.TerminalNode;
|
||||
|
||||
/**
|
||||
* This class provides an empty implementation of {@link VSLParserListener},
|
||||
* which can be extended to create a listener which only needs to handle a subset
|
||||
* of the available methods.
|
||||
*/
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public class VSLParserBaseListener implements VSLParserListener {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterProgram(VSLParser.ProgramContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitProgram(VSLParser.ProgramContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterFunction(VSLParser.FunctionContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitFunction(VSLParser.FunctionContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterPrototype(VSLParser.PrototypeContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitPrototype(VSLParser.PrototypeContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterList_instr(VSLParser.List_instrContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitList_instr(VSLParser.List_instrContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterInstruction(VSLParser.InstructionContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitInstruction(VSLParser.InstructionContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterExpression(VSLParser.ExpressionContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitExpression(VSLParser.ExpressionContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterTd_expression(VSLParser.Td_expressionContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitTd_expression(VSLParser.Td_expressionContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterLit(VSLParser.LitContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitLit(VSLParser.LitContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterIdent(VSLParser.IdentContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitIdent(VSLParser.IdentContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterType(VSLParser.TypeContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitType(VSLParser.TypeContext ctx) { }
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void enterEveryRule(ParserRuleContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void exitEveryRule(ParserRuleContext ctx) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void visitTerminal(TerminalNode node) { }
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* <p>The default implementation does nothing.</p>
|
||||
*/
|
||||
@Override public void visitErrorNode(ErrorNode node) { }
|
||||
}
|
||||
116
src/main/antlr/.antlr/VSLParserListener.java
Normal file
116
src/main/antlr/.antlr/VSLParserListener.java
Normal file
@@ -0,0 +1,116 @@
|
||||
// Generated from c:/Users/Thibaut/Documents/Git/PDS/tp2-vsl-pds/src/main/antlr/VSLParser.g by ANTLR 4.13.1
|
||||
|
||||
package TP2;
|
||||
import TP2.asd.Program.*;
|
||||
import TP2.asd.*;
|
||||
import TP2.asd.Interface.*;
|
||||
import TP2.asd.Eval.*;
|
||||
|
||||
import org.antlr.v4.runtime.tree.ParseTreeListener;
|
||||
|
||||
/**
|
||||
* This interface defines a complete listener for a parse tree produced by
|
||||
* {@link VSLParser}.
|
||||
*/
|
||||
public interface VSLParserListener extends ParseTreeListener {
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#program}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterProgram(VSLParser.ProgramContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#program}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitProgram(VSLParser.ProgramContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#function}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterFunction(VSLParser.FunctionContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#function}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitFunction(VSLParser.FunctionContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#prototype}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterPrototype(VSLParser.PrototypeContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#prototype}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitPrototype(VSLParser.PrototypeContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#list_instr}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterList_instr(VSLParser.List_instrContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#list_instr}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitList_instr(VSLParser.List_instrContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#instruction}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterInstruction(VSLParser.InstructionContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#instruction}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitInstruction(VSLParser.InstructionContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#expression}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterExpression(VSLParser.ExpressionContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#expression}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitExpression(VSLParser.ExpressionContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#td_expression}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterTd_expression(VSLParser.Td_expressionContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#td_expression}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitTd_expression(VSLParser.Td_expressionContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#lit}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterLit(VSLParser.LitContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#lit}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitLit(VSLParser.LitContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#ident}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterIdent(VSLParser.IdentContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#ident}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitIdent(VSLParser.IdentContext ctx);
|
||||
/**
|
||||
* Enter a parse tree produced by {@link VSLParser#type}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void enterType(VSLParser.TypeContext ctx);
|
||||
/**
|
||||
* Exit a parse tree produced by {@link VSLParser#type}.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
void exitType(VSLParser.TypeContext ctx);
|
||||
}
|
||||
@@ -29,9 +29,6 @@ public class Main {
|
||||
VSLLexer lexer = new VSLLexer(input);
|
||||
CommonTokenStream tokens = new CommonTokenStream(lexer);
|
||||
|
||||
for (Token token : tokens.getTokens()) {
|
||||
System.out.println("Token: " + token.getText() + " Type: " + token.getType());
|
||||
}
|
||||
|
||||
// Instantiate Parser
|
||||
VSLParser parser = new VSLParser(tokens);
|
||||
@@ -42,6 +39,8 @@ public class Main {
|
||||
// Pretty-print the program (to debug parsing)
|
||||
System.err.println("todo " + ast);
|
||||
|
||||
System.out.println("\n\n PRETTYPRINTER : \n--------------\n" + ast.prettyprinter() + "\n--------------\nFIN PRETTYPRINTER");
|
||||
|
||||
// Verify the program semantic
|
||||
|
||||
// Generate the intermediate representation
|
||||
|
||||
@@ -8,16 +8,20 @@ import TP2.asd.Program.*;
|
||||
public interface Interface{
|
||||
public interface ProgramI {
|
||||
public <H,S> S accept(ProgramVisitor<H,S> v, H h);
|
||||
public String prettyprinter();
|
||||
}
|
||||
public interface Function {
|
||||
public <H,S> S accept(FunctionVisitor<H,S> v, H h);
|
||||
public String prettyprinter(String indent);
|
||||
}
|
||||
public interface Instruction {
|
||||
public <H,S> S accept(InstrVisitor<H,S> v, H h);
|
||||
public String prettyprinter(String indent);
|
||||
}
|
||||
|
||||
public interface Expression {
|
||||
public <H,S> S accept(ExprVisitor<H,S> v, H h);
|
||||
public String prettyprinter();
|
||||
}
|
||||
|
||||
public interface ProgramVisitor<H,S> {
|
||||
|
||||
@@ -1,17 +1,40 @@
|
||||
package TP2.asd;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import TP2.asd.Interface.*;
|
||||
import TP2.asd.Eval.*;
|
||||
import org.antlr.grammar.v3.ANTLRParser.defaultNodeOption_return;
|
||||
|
||||
import TP2.asd.Interface.ExprVisitor;
|
||||
import TP2.asd.Interface.Expression;
|
||||
import TP2.asd.Interface.Function;
|
||||
import TP2.asd.Interface.FunctionVisitor;
|
||||
import TP2.asd.Interface.InstrVisitor;
|
||||
import TP2.asd.Interface.Instruction;
|
||||
import TP2.asd.Interface.Op;
|
||||
import TP2.asd.Interface.ProgramI;
|
||||
import TP2.asd.Interface.ProgramVisitor;
|
||||
import TP2.asd.Interface.Type;
|
||||
|
||||
|
||||
|
||||
public class Program{
|
||||
public static record ProgramImp(ArrayList<Function> instructions) implements ProgramI{
|
||||
|
||||
static String INDENT = " ";
|
||||
|
||||
public static record ProgramImp(ArrayList<Function> fonctions) implements ProgramI{
|
||||
public <H, S> S accept(ProgramVisitor<H, S> v, H h) {
|
||||
return v.visitProgram(this, h);
|
||||
}
|
||||
|
||||
public String prettyprinter(){
|
||||
String str ="";
|
||||
for(int i = 0; i<fonctions.size(); i++){
|
||||
str += fonctions.get(i).prettyprinter(INDENT);
|
||||
if(i<fonctions.size()-1) str += "\n";
|
||||
}
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
public static record FunctionImp(Type type, String nom, ArrayList<Instruction> instructions)implements Function {
|
||||
@@ -22,18 +45,44 @@ public class Program{
|
||||
public <H, S> S accept(FunctionVisitor<H, S> v, H h) {
|
||||
return v.visitFunction(this, h);
|
||||
}
|
||||
|
||||
public String prettyprinter(String indent){
|
||||
String str = indent+"FUNC " + type.prettyprinter()+ " " + nom +"(){\n";
|
||||
for(int i = 0; i<instructions.size(); i++){
|
||||
str += instructions.get(i).prettyprinter(indent+INDENT)+"\n";
|
||||
}
|
||||
str+= indent+"}";
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
public static record ConstImp(int c) implements Expression{
|
||||
public <H, S> S accept(ExprVisitor<H, S> v, H h) {
|
||||
return v.visitConst(this, h);
|
||||
}
|
||||
}
|
||||
|
||||
public String prettyprinter(){
|
||||
return c+"";
|
||||
}
|
||||
}
|
||||
|
||||
public static record BinopExpressionImp(Op op,Expression e1, Expression e2) implements Expression{
|
||||
public <H, S> S accept(ExprVisitor<H, S> v, H h) {
|
||||
return v.visitBinOp(this, h);
|
||||
}
|
||||
|
||||
public String prettyprinter(){
|
||||
String opStr = "?";
|
||||
switch(op){
|
||||
case PLUS: opStr = "+"; break;
|
||||
case DIV: opStr = "/"; break;
|
||||
case MINUS: opStr = "-"; break;
|
||||
case MOD: opStr = "%"; break;
|
||||
case TIMES: opStr = "*"; break;
|
||||
default:break;
|
||||
}
|
||||
return "(" + e1.prettyprinter() +" "+ opStr +" " + e2.prettyprinter() + ")";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -41,6 +90,10 @@ public class Program{
|
||||
public <H, S> S accept(InstrVisitor<H, S> v, H h) {
|
||||
return v.visitReturn(this,h);
|
||||
}
|
||||
|
||||
public String prettyprinter(String indent){
|
||||
return indent+"RETURN " + e.prettyprinter();
|
||||
}
|
||||
}
|
||||
|
||||
public static record Type_voidImp() implements Type{
|
||||
@@ -61,7 +114,7 @@ public class Program{
|
||||
public Integer visitProgram(ProgramImp e, Map<String, Integer> h) {
|
||||
Integer result = null;
|
||||
FunctionEval functionEval = new FunctionEval();
|
||||
for (Function function : e.instructions()) {
|
||||
for (Function function : e.fonctions()) {
|
||||
result = function.accept(functionEval, h);
|
||||
}
|
||||
return result;
|
||||
|
||||
Reference in New Issue
Block a user