prettyprinter

This commit is contained in:
trochas
2025-04-02 15:04:39 +02:00
parent 52a5c00f74
commit 4da495479f
7 changed files with 349 additions and 11 deletions

View File

@@ -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;

View File

@@ -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.*;

View 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) { }
}

View 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);
}

View File

@@ -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

View File

@@ -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> {

View File

@@ -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;