diff --git a/ArbreAbstrait/DeclarationVariable.java b/ArbreAbstrait/DeclarationVariable.java index 817e09b10e2dd10ed938571fd6d327cdda8328b9..69f259aad4a5842bf21923053f017f04b3b102aa 100755 --- a/ArbreAbstrait/DeclarationVariable.java +++ b/ArbreAbstrait/DeclarationVariable.java @@ -15,8 +15,8 @@ public class DeclarationVariable extends Declaration{ } } - public Idf getIdentifier(){ - return listeId.get(0); + public Idf getIdentifier(int i){ + return listeId.get(i); } diff --git a/ArbreAbstrait/Entree.java b/ArbreAbstrait/Entree.java index f70e7f43483f2fdc2406d1568ee8c36e37e3d072..f880c9ff38fc2808b82a501e3458df8b77e86686 100755 --- a/ArbreAbstrait/Entree.java +++ b/ArbreAbstrait/Entree.java @@ -12,6 +12,7 @@ public class Entree{ public String getNom() { return this.varName; } + @Override public boolean equals(Object obj) { // TODO Auto-generated method stub diff --git a/HepialLexer.java b/HepialLexer.java new file mode 100644 index 0000000000000000000000000000000000000000..651fcdc2b81ca88aefd25c0b1659a3dac433e97b --- /dev/null +++ b/HepialLexer.java @@ -0,0 +1,914 @@ +/* The following code was generated by JFlex 1.6.1 */ + +import java_cup.runtime.*; +import java.util.*; + + +/** + * This class is a scanner generated by + * <a href="http://www.jflex.de/">JFlex</a> 1.6.1 + * from the specification file <tt>hepial.flex</tt> + */ +class HepialLexer implements java_cup.runtime.Scanner { + + /** This character denotes the end of file */ + public static final int YYEOF = -1; + + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int YYINITIAL = 0; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\16\1\15\1\15\1\15\1\15\22\0\1\16\1\0\1\3"+ + "\5\0\1\7\1\10\1\45\1\43\1\4\1\44\1\13\1\14\12\2"+ + "\1\0\1\5\1\46\1\6\1\47\2\0\32\1\1\11\1\0\1\12"+ + "\3\0\1\23\1\27\1\35\1\26\1\25\1\32\1\22\1\1\1\33"+ + "\2\1\1\37\1\24\1\34\1\21\1\17\1\40\1\20\1\36\1\31"+ + "\1\30\1\41\1\1\1\42\2\1\1\0\1\16\10\0\1\15\32\0"+ + "\1\16\u15df\0\1\16\u097f\0\13\16\35\0\1\15\1\15\5\0\1\16"+ + "\57\0\1\16\u0fa0\0\1\16\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\ud00f\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\1\0\1\1\1\2\1\0\1\3\1\4\1\5\1\6"+ + "\1\7\1\10\1\11\1\0\1\12\1\13\2\1\1\14"+ + "\12\1\1\15\1\16\1\17\1\20\1\21\1\22\1\23"+ + "\1\24\1\13\2\1\1\25\1\1\1\26\11\1\1\27"+ + "\2\1\1\30\1\31\1\32\14\1\1\33\5\1\1\34"+ + "\7\1\1\35\6\1\1\36\1\37\1\1\1\40\6\1"+ + "\1\41\3\1\1\42\1\1\1\43\2\1\1\44\1\45"+ + "\3\1\1\46\6\1\1\47\1\50\1\51\3\1\1\52"+ + "\1\53\2\1\1\54\1\1\1\55\1\56"; + + private static int [] zzUnpackAction() { + int [] result = new int[134]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\50\0\120\0\170\0\240\0\240\0\310\0\240"+ + "\0\240\0\240\0\240\0\360\0\u0118\0\u0140\0\u0168\0\u0190"+ + "\0\u01b8\0\u01e0\0\u0208\0\u0230\0\u0258\0\u0280\0\u02a8\0\u02d0"+ + "\0\u02f8\0\u0320\0\u0348\0\240\0\240\0\240\0\u0370\0\u0398"+ + "\0\u03c0\0\240\0\240\0\u03e8\0\u0410\0\u0438\0\50\0\u0460"+ + "\0\50\0\u0488\0\u04b0\0\u04d8\0\u0500\0\u0528\0\u0550\0\u0578"+ + "\0\u05a0\0\u05c8\0\u05f0\0\u0618\0\u0640\0\240\0\240\0\240"+ + "\0\u0668\0\u0690\0\u06b8\0\u06e0\0\u0708\0\u0730\0\u0758\0\u0780"+ + "\0\u07a8\0\u07d0\0\u07f8\0\u0820\0\50\0\u0848\0\u0870\0\u0898"+ + "\0\u08c0\0\u08e8\0\50\0\u0910\0\u0938\0\u0960\0\u0988\0\u09b0"+ + "\0\u09d8\0\u0a00\0\50\0\u0a28\0\u0a50\0\u0a78\0\u0aa0\0\u0ac8"+ + "\0\u0af0\0\50\0\50\0\u0b18\0\50\0\u0b40\0\u0b68\0\u0b90"+ + "\0\u0bb8\0\u0be0\0\u0c08\0\50\0\u0c30\0\u0c58\0\u0c80\0\50"+ + "\0\u0ca8\0\50\0\u0cd0\0\u0cf8\0\50\0\50\0\u0d20\0\u0d48"+ + "\0\u0d70\0\50\0\u0d98\0\u0dc0\0\u0de8\0\u0e10\0\u0e38\0\u0e60"+ + "\0\50\0\50\0\50\0\u0e88\0\u0eb0\0\u0ed8\0\50\0\50"+ + "\0\u0f00\0\u0f28\0\50\0\u0f50\0\50\0\50"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[134]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\0\1\2\1\3\1\4\1\5\1\6\1\7\1\10"+ + "\1\11\1\12\1\13\1\14\1\15\2\16\1\17\1\2"+ + "\1\20\1\2\1\21\1\2\1\22\1\23\1\24\1\2"+ + "\1\25\1\26\1\2\1\27\1\30\1\31\1\32\1\2"+ + "\1\33\1\2\1\34\1\35\1\36\1\37\1\40\1\0"+ + "\2\2\14\0\24\2\7\0\1\3\45\0\3\4\1\41"+ + "\44\4\56\0\1\42\54\0\1\43\50\0\1\44\50\0"+ + "\2\16\32\0\2\2\14\0\1\2\1\45\1\46\21\2"+ + "\6\0\2\2\14\0\11\2\1\47\12\2\6\0\2\2"+ + "\14\0\20\2\1\50\3\2\6\0\2\2\14\0\12\2"+ + "\1\51\2\2\1\52\1\53\5\2\6\0\2\2\14\0"+ + "\6\2\1\54\15\2\6\0\2\2\14\0\2\2\1\55"+ + "\21\2\6\0\2\2\14\0\4\2\1\56\17\2\6\0"+ + "\2\2\14\0\4\2\1\57\7\2\1\60\7\2\6\0"+ + "\2\2\14\0\2\2\1\61\21\2\6\0\2\2\14\0"+ + "\2\2\1\62\21\2\6\0\2\2\14\0\14\2\1\63"+ + "\7\2\6\0\2\2\14\0\14\2\1\64\7\2\6\0"+ + "\2\2\14\0\1\2\1\65\22\2\13\0\1\66\40\0"+ + "\1\67\6\0\1\70\44\0\1\4\44\0\15\44\1\0"+ + "\32\44\1\0\2\2\14\0\2\2\1\71\21\2\6\0"+ + "\2\2\14\0\11\2\1\72\12\2\6\0\2\2\14\0"+ + "\2\2\1\73\15\2\1\74\3\2\6\0\2\2\14\0"+ + "\12\2\1\75\11\2\6\0\2\2\14\0\1\2\1\76"+ + "\22\2\6\0\2\2\14\0\10\2\1\77\13\2\6\0"+ + "\2\2\14\0\2\2\1\100\21\2\6\0\2\2\14\0"+ + "\15\2\1\101\6\2\6\0\2\2\14\0\11\2\1\102"+ + "\2\2\1\103\7\2\6\0\2\2\14\0\15\2\1\104"+ + "\6\2\6\0\2\2\14\0\15\2\1\105\6\2\6\0"+ + "\2\2\14\0\15\2\1\106\6\2\6\0\2\2\14\0"+ + "\15\2\1\107\6\2\6\0\2\2\14\0\1\2\1\110"+ + "\22\2\6\0\2\2\14\0\4\2\1\111\17\2\6\0"+ + "\2\2\14\0\3\2\1\112\20\2\6\0\2\2\14\0"+ + "\1\2\1\113\22\2\6\0\2\2\14\0\1\2\1\114"+ + "\22\2\6\0\2\2\14\0\4\2\1\115\17\2\6\0"+ + "\2\2\14\0\14\2\1\116\7\2\6\0\2\2\14\0"+ + "\14\2\1\117\7\2\6\0\2\2\14\0\11\2\1\120"+ + "\12\2\6\0\2\2\14\0\20\2\1\121\3\2\6\0"+ + "\2\2\14\0\12\2\1\122\11\2\6\0\2\2\14\0"+ + "\23\2\1\123\6\0\2\2\14\0\1\2\1\124\22\2"+ + "\6\0\2\2\14\0\1\125\11\2\1\126\4\2\1\127"+ + "\4\2\6\0\2\2\14\0\17\2\1\130\4\2\6\0"+ + "\2\2\14\0\2\2\1\131\21\2\6\0\2\2\14\0"+ + "\6\2\1\132\15\2\6\0\2\2\14\0\14\2\1\133"+ + "\7\2\6\0\2\2\14\0\1\2\1\134\22\2\6\0"+ + "\2\2\14\0\17\2\1\135\4\2\6\0\2\2\14\0"+ + "\15\2\1\136\6\2\6\0\2\2\14\0\6\2\1\137"+ + "\15\2\6\0\2\2\14\0\1\2\1\140\22\2\6\0"+ + "\2\2\14\0\12\2\1\141\11\2\6\0\2\2\14\0"+ + "\6\2\1\142\15\2\6\0\2\2\14\0\21\2\1\143"+ + "\2\2\6\0\2\2\14\0\6\2\1\144\15\2\6\0"+ + "\2\2\14\0\1\2\1\145\1\146\21\2\6\0\2\2"+ + "\14\0\4\2\1\147\17\2\6\0\2\2\14\0\14\2"+ + "\1\150\7\2\6\0\2\2\14\0\12\2\1\151\11\2"+ + "\6\0\2\2\14\0\15\2\1\152\6\2\6\0\2\2"+ + "\14\0\4\2\1\153\17\2\6\0\2\2\14\0\12\2"+ + "\1\154\11\2\6\0\2\2\14\0\1\2\1\155\22\2"+ + "\6\0\2\2\14\0\6\2\1\156\15\2\6\0\2\2"+ + "\14\0\1\157\23\2\6\0\2\2\14\0\6\2\1\160"+ + "\15\2\6\0\2\2\14\0\11\2\1\161\12\2\6\0"+ + "\2\2\14\0\3\2\1\162\20\2\6\0\2\2\14\0"+ + "\11\2\1\163\12\2\6\0\2\2\14\0\15\2\1\164"+ + "\6\2\6\0\2\2\14\0\4\2\1\165\17\2\6\0"+ + "\2\2\14\0\5\2\1\166\16\2\6\0\2\2\14\0"+ + "\7\2\1\167\14\2\6\0\2\2\14\0\1\2\1\170"+ + "\22\2\6\0\2\2\14\0\15\2\1\171\6\2\6\0"+ + "\2\2\14\0\6\2\1\172\15\2\6\0\2\2\14\0"+ + "\1\2\1\173\22\2\6\0\2\2\14\0\12\2\1\174"+ + "\11\2\6\0\2\2\14\0\15\2\1\175\6\2\6\0"+ + "\2\2\14\0\5\2\1\176\16\2\6\0\2\2\14\0"+ + "\6\2\1\177\15\2\6\0\2\2\14\0\3\2\1\200"+ + "\20\2\6\0\2\2\14\0\21\2\1\201\2\2\6\0"+ + "\2\2\14\0\12\2\1\202\11\2\6\0\2\2\14\0"+ + "\6\2\1\203\15\2\6\0\2\2\14\0\11\2\1\204"+ + "\12\2\6\0\2\2\14\0\6\2\1\205\15\2\6\0"+ + "\2\2\14\0\6\2\1\206\15\2\5\0"; + + private static int [] zzUnpackTrans() { + int [] result = new int[3960]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unknown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code> + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\1\0\2\1\1\0\2\11\1\1\4\11\1\0\17\1"+ + "\3\11\3\1\2\11\22\1\3\11\116\1"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[134]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the input device */ + private java.io.Reader zzReader; + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** number of newlines encountered up to the start of the matched text */ + private int yyline; + + /** the number of characters up to the start of the matched text */ + private int yychar; + + /** + * the number of characters from the last newline up to the start of the + * matched text + */ + private int yycolumn; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /** denotes if the user-EOF-code has already been executed */ + private boolean zzEOFDone; + + /** + * The number of occupied positions in zzBuffer beyond zzEndRead. + * When a lead/high surrogate has been read from the input stream + * into the final zzBuffer position, this will have a value of 1; + * otherwise, it will have a value of 0. + */ + private int zzFinalHighSurrogate = 0; + + /* user code: */ + +// Print parsing errors +public void yyerror() { + System.out.println("error line " +yyline + " column " +yycolumn + + " " +yytext()); +} + + + + /** + * Creates a new scanner + * + * @param in the java.io.Reader to read input from. + */ + HepialLexer(java.io.Reader in) { + this.zzReader = in; + } + + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x110000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 182) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + + /** + * Refills the input buffer. + * + * @return <code>false</code>, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + + /* first: make room (if you can) */ + if (zzStartRead > 0) { + zzEndRead += zzFinalHighSurrogate; + zzFinalHighSurrogate = 0; + System.arraycopy(zzBuffer, zzStartRead, + zzBuffer, 0, + zzEndRead-zzStartRead); + + /* translate stored positions */ + zzEndRead-= zzStartRead; + zzCurrentPos-= zzStartRead; + zzMarkedPos-= zzStartRead; + zzStartRead = 0; + } + + /* is the buffer big enough? */ + if (zzCurrentPos >= zzBuffer.length - zzFinalHighSurrogate) { + /* if not: blow it up */ + char newBuffer[] = new char[zzBuffer.length*2]; + System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); + zzBuffer = newBuffer; + zzEndRead += zzFinalHighSurrogate; + zzFinalHighSurrogate = 0; + } + + /* fill the buffer with new input */ + int requested = zzBuffer.length - zzEndRead; + int numRead = zzReader.read(zzBuffer, zzEndRead, requested); + + /* not supposed to occur according to specification of java.io.Reader */ + if (numRead == 0) { + throw new java.io.IOException("Reader returned 0 characters. See JFlex examples for workaround."); + } + if (numRead > 0) { + zzEndRead += numRead; + /* If numRead == requested, we might have requested to few chars to + encode a full Unicode character. We assume that a Reader would + otherwise never return half characters. */ + if (numRead == requested) { + if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) { + --zzEndRead; + zzFinalHighSurrogate = 1; + } + } + /* potentially more input available */ + return false; + } + + /* numRead < 0 ==> end of stream */ + return true; + } + + + /** + * Closes the input stream. + */ + public final void yyclose() throws java.io.IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ + + if (zzReader != null) + zzReader.close(); + } + + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + * + * All internal variables are reset, the old input stream + * <b>cannot</b> be reused (internal buffer is discarded and lost). + * Lexical state is set to <tt>ZZ_INITIAL</tt>. + * + * Internal scan buffer is resized down to its initial length, if it has grown. + * + * @param reader the new input stream + */ + public final void yyreset(java.io.Reader reader) { + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + zzEOFDone = false; + zzEndRead = zzStartRead = 0; + zzCurrentPos = zzMarkedPos = 0; + zzFinalHighSurrogate = 0; + yyline = yychar = yycolumn = 0; + zzLexicalState = YYINITIAL; + if (zzBuffer.length > ZZ_BUFFERSIZE) + zzBuffer = new char[ZZ_BUFFERSIZE]; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); + } + + + /** + * Returns the character at position <tt>pos</tt> from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead+pos]; + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Contains user EOF-code, which will be executed exactly once, + * when the end of file is reached + */ + private void zzDoEOF() throws java.io.IOException { + if (!zzEOFDone) { + zzEOFDone = true; + yyclose(); + } + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public java_cup.runtime.Symbol next_token() throws java.io.IOException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char [] zzBufferL = zzBuffer; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + boolean zzR = false; + int zzCh; + int zzCharCount; + for (zzCurrentPosL = zzStartRead ; + zzCurrentPosL < zzMarkedPosL ; + zzCurrentPosL += zzCharCount ) { + zzCh = Character.codePointAt(zzBufferL, zzCurrentPosL, zzMarkedPosL); + zzCharCount = Character.charCount(zzCh); + switch (zzCh) { + case '\u000B': + case '\u000C': + case '\u0085': + case '\u2028': + case '\u2029': + yyline++; + yycolumn = 0; + zzR = false; + break; + case '\r': + yyline++; + yycolumn = 0; + zzR = true; + break; + case '\n': + if (zzR) + zzR = false; + else { + yyline++; + yycolumn = 0; + } + break; + default: + zzR = false; + yycolumn += zzCharCount; + } + } + + if (zzR) { + // peek one character ahead if it is \n (if we have counted one line too much) + boolean zzPeek; + if (zzMarkedPosL < zzEndReadL) + zzPeek = zzBufferL[zzMarkedPosL] == '\n'; + else if (zzAtEOF) + zzPeek = false; + else { + boolean eof = zzRefill(); + zzEndReadL = zzEndRead; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + if (eof) + zzPeek = false; + else + zzPeek = zzBufferL[zzMarkedPosL] == '\n'; + } + if (zzPeek) yyline--; + } + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + // set up zzAction for empty match case: + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + } + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); + zzCurrentPosL += Character.charCount(zzInput); + } + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); + zzCurrentPosL += Character.charCount(zzInput); + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + zzDoEOF(); + { return new java_cup.runtime.Symbol(sym.EOF); } + } + else { + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 1: + { return new Symbol(sym.IDENT, yyline, yycolumn, yytext()); + } + case 47: break; + case 2: + { return new Symbol(sym.INTEGERCONST, yyline, yycolumn, Integer.parseInt(yytext())); + } + case 48: break; + case 3: + { return new Symbol(sym.COMMA, yyline, yycolumn); + } + case 49: break; + case 4: + { return new Symbol(sym.SEMICOLON, yyline, yycolumn); + } + case 50: break; + case 5: + { return new Symbol(sym.EQUAL, yyline, yycolumn); + } + case 51: break; + case 6: + { return new Symbol(sym.OPENPARENT, yyline, yycolumn); + } + case 52: break; + case 7: + { return new Symbol(sym.CLOSEPARENT, yyline, yycolumn); + } + case 53: break; + case 8: + { return new Symbol(sym.OPENBRACK, yyline, yycolumn); + } + case 54: break; + case 9: + { return new Symbol(sym.CLOSEBRACK, yyline, yycolumn); + } + case 55: break; + case 10: + { return new Symbol(sym.DIVIDE, yyline, yycolumn); + } + case 56: break; + case 11: + { ; + } + case 57: break; + case 12: + { return new Symbol(sym.TO, yyline, yycolumn); + } + case 58: break; + case 13: + { return new Symbol(sym.PLUS, yyline, yycolumn); + } + case 59: break; + case 14: + { return new Symbol(sym.MINUS, yyline, yycolumn); + } + case 60: break; + case 15: + { return new Symbol(sym.TIMES, yyline, yycolumn); + } + case 61: break; + case 16: + { return new Symbol(sym.INF, yyline, yycolumn); + } + case 62: break; + case 17: + { return new Symbol(sym.SUP, yyline, yycolumn); + } + case 63: break; + case 18: + { return new Symbol(sym.STRINGCONST, yyline, yycolumn, yytext()); + } + case 64: break; + case 19: + { return new Symbol(sym.EQUALS, yyline, yycolumn); + } + case 65: break; + case 20: + { return new Symbol(sym.DOUBLEPOINTS, yyline, yycolumn); + } + case 66: break; + case 21: + { return new Symbol(sym.OR, yyline, yycolumn); + } + case 67: break; + case 22: + { return new Symbol(sym.AND, yyline, yycolumn); + } + case 68: break; + case 23: + { return new Symbol(sym.IF, yyline, yycolumn); + } + case 69: break; + case 24: + { return new Symbol(sym.INFEQUAL, yyline, yycolumn); + } + case 70: break; + case 25: + { return new Symbol(sym.DIFF, yyline, yycolumn); + } + case 71: break; + case 26: + { return new Symbol(sym.SUPEQUAL, yyline, yycolumn); + } + case 72: break; + case 27: + { return new Symbol(sym.NOT, yyline, yycolumn); + } + case 73: break; + case 28: + { return new Symbol(sym.FOR, yyline, yycolumn); + } + case 74: break; + case 29: + { return new Symbol(sym.FALSE, yyline, yycolumn); + } + case 75: break; + case 30: + { return new Symbol(sym.READ, yyline, yycolumn); + } + case 76: break; + case 31: + { return new Symbol(sym.TRUE, yyline, yycolumn); + } + case 77: break; + case 32: + { return new Symbol(sym.THEN, yyline, yycolumn); + } + case 78: break; + case 33: + { return new Symbol(sym.DO, yyline, yycolumn); + } + case 79: break; + case 34: + { return new Symbol(sym.ENDIF, yyline, yycolumn); + } + case 80: break; + case 35: + { return new Symbol(sym.ELSE, yyline, yycolumn); + } + case 81: break; + case 36: + { return new Symbol(sym.TINTEGER, yyline, yycolumn); + } + case 82: break; + case 37: + { return new Symbol(sym.WRITE, yyline, yycolumn); + } + case 83: break; + case 38: + { return new Symbol(sym.ENDPRG, yyline, yycolumn); + } + case 84: break; + case 39: + { return new Symbol(sym.TBOOLEAN, yyline, yycolumn); + } + case 85: break; + case 40: + { return new Symbol(sym.WHILE, yyline, yycolumn); + } + case 86: break; + case 41: + { return new Symbol(sym.ENDFOR, yyline, yycolumn); + } + case 87: break; + case 42: + { return new Symbol(sym.FROM, yyline, yycolumn); + } + case 88: break; + case 43: + { return new Symbol(sym.STARTPRG, yyline, yycolumn); + } + case 89: break; + case 44: + { return new Symbol(sym.PRG, yyline, yycolumn); + } + case 90: break; + case 45: + { return new Symbol(sym.CONSTANT, yyline, yycolumn); + } + case 91: break; + case 46: + { return new Symbol(sym.ENDWHILE, yyline, yycolumn); + } + case 92: break; + default: + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/Tests/test_base_with_sementic_issue.input b/Tests/test_base_with_sementic_issue.input index bd0cbe5869319b6743654fba53c70d56d46b5fce..ba160e096edcd5a504084fe001c75fb72c084ddb 100755 --- a/Tests/test_base_with_sementic_issue.input +++ b/Tests/test_base_with_sementic_issue.input @@ -1,14 +1,8 @@ programme Program - entier z; - entier x; - booleen p; +entier x, y; +booleen z; debutprg - c = 1; - si c alors c = 2;sinon c = 0; - finsi - - ecrire "::: loop0"; - pour x allantde 0 a 10 faire - ecrire x; - finpour + x = 24; + z = vrai; + y = x + z; finprg diff --git a/Visitors/SemanticAnalyzer.java b/Visitors/SemanticAnalyzer.java index 2409529da2d5ccea6a64b9e5bf12a0a291d9bc27..d2dc470d521a4a6ccfe8534439a2613bf9020566 100755 --- a/Visitors/SemanticAnalyzer.java +++ b/Visitors/SemanticAnalyzer.java @@ -11,14 +11,28 @@ public class SemanticAnalyzer implements ASTVisitor { public Object visit(Addition node) { + node.getGauche().accept(this); + node.getDroite().accept(this); + + if (!(node.getGauche() instanceof Nombre)) { + throw new RuntimeException("Impossible d'effectuer l'addition car la valeur de gauche n'est pas un nombre !"); + } + if (!(node.getDroite() instanceof Nombre)) { + throw new RuntimeException("Impossible d'effectuer l'addition car la valeur de droite n'est pas un nombre !"); + } return null; } public Object visit(Affectation node) { + node.getDestination().accept(this); + node.getSource().accept(this); return null; } public Object visit(Bloc node) { + for (Instruction inst : node.getInstructions()) { + inst.accept(this); + } return null; } @@ -26,75 +40,161 @@ public class SemanticAnalyzer implements ASTVisitor { return null; } - public Object visit(Condition node) { return null; } + public Object visit(Condition node) { + node.getCondition().accept(this); + node.getThenInstruction().accept(this); + if (node.hasElse()) { + node.getElseInstruction().accept(this); + } + return null; + } - public Object visit(DeclarationConstant node) { return null; } + public Object visit(DeclarationConstant node) { + node.getIdentifier().accept(this); + node.getConstantExpression().accept(this); + return null; + } public Object visit(DeclarationProgramme node) { + node.getIdentifier().accept(this); + node.getDeclaration().accept(this); + node.getInstructions().accept(this); return null; } - public Object visit(DeclarationVariable node) { return null; } + public Object visit(DeclarationVariable node) { + for (int i = 0; i < node.listeId.size(); i++) { + node.getIdentifier(i).accept(this); + } + return null; + } - public Object visit(Diff node) { return null; } + public Object visit(Diff node) { + node.getGauche().accept(this); + node.getDroite().accept(this); + + return null; + } public Object visit(Division node) { + node.getGauche().accept(this); + node.getDroite().accept(this); return null; } - public Object visit(Ecrire node) { return null; } + public Object visit(Ecrire node) { + node.getSource().accept(this); + return null; + } public Object visit(Egal node) { + node.getGauche().accept(this); + node.getDroite().accept(this); return null; } public Object visit(Et node) { + node.getGauche().accept(this); + node.getDroite().accept(this); return null; } - public Object visit(Faux node) { return null; } + public Object visit(Faux node) { + return null; + } public Object visit(Idf node) { - return null; + return node.getNom(); } - public Object visit(InfEgal node) { return null; } + public Object visit(InfEgal node) { + node.getGauche().accept(this); + node.getDroite().accept(this); + return null; + } - public Object visit(Inferieur node) { return null; } + public Object visit(Inferieur node) { + node.getGauche().accept(this); + node.getDroite().accept(this); + return null; + } - public Object visit(Lire node) { return null; } + public Object visit(Lire node) { + node.getDestination().accept(this); + return null; + } - public Object visit(Moins node) { return null; } + public Object visit(Moins node) { + node.getOperand().accept(this); + return null; + } public Object visit(Nombre node) { + return node.getValeur(); + } + + public Object visit(Non node) { + node.getOperand().accept(this); return null; } - public Object visit(Non node) { return null; } + public Object visit(Ou node) { + node.getGauche().accept(this); + node.getDroite().accept(this); + return null; + } - public Object visit(Ou node) { return null; } + public Object visit(Parentheses node) { + node.getExpression().accept(this); + return null; + } - public Object visit(Parentheses node) { return null; } + public Object visit(Pour node) { + node.getIteratorName().accept(this); + node.getFrom().accept(this); + node.getTo().accept(this); + node.getInstruction().accept(this); - public Object visit(Pour node) { return null; } + return null; + } public Object visit(Produit node) { + node.getGauche().accept(this); + node.getDroite().accept(this); return null; } - public Object visit(Relation node) { return null; } + public Object visit(Relation node) { + return null; + } public Object visit(Soustraction node) { + node.getGauche().accept(this); + node.getDroite().accept(this); return null; } - public Object visit(SupEgal node) { return null; } + public Object visit(SupEgal node) { + node.getGauche().accept(this); + node.getDroite().accept(this); + return null; + } - public Object visit(Superieur node) { return null; } + public Object visit(Superieur node) { + node.getGauche().accept(this); + node.getDroite().accept(this); + return null; + } - public Object visit(Tantque node) { return null; } + public Object visit(Tantque node) { + return null; + } - public Object visit(Unaire node) { return null; } + public Object visit(Unaire node) { + return null; + } - public Object visit(Vrai node) { return null; } + public Object visit(Vrai node) { + return null; + } } diff --git a/Visitors/SourceCodeGenerator.java b/Visitors/SourceCodeGenerator.java index 43ec55987d4b5bd520a2a407f72dd543238f8bbe..de391007d5e97575d766c17fc140fdf7c62b1052 100755 --- a/Visitors/SourceCodeGenerator.java +++ b/Visitors/SourceCodeGenerator.java @@ -107,12 +107,22 @@ public class SourceCodeGenerator implements ASTVisitor { } public Object visit(DeclarationVariable node) { - Symbole sym = TDS.getInstance().identifier(new Entree(node.getIdentifier().getNom())); + for (int i = 0; i < node.listeId.size(); i++) { + Symbole sym = TDS.getInstance().identifier(new Entree(node.listeId.get(i).getNom())); + + code += sym + " "; + //code += node.listeId.get(i).getNom(); + + node.getIdentifier(i).accept(this); + if (!isParameterDeclaration) + code += ";"; + if (!(i == node.listeId.size() - 1)) { + code += "\n"; + addTabulation(); + } + + } - code += sym + " "; - node.getIdentifier().accept(this); - if (!isParameterDeclaration) - code += ";"; return null; } diff --git a/hepial.cup b/hepial.cup old mode 100755 new mode 100644 index fb2b634ed6bb03c1d8fe323c0b31829ac4876a26..8e7a6735bfe9f9f9bf9fac89318f8f5ef516a3f8 --- a/hepial.cup +++ b/hepial.cup @@ -73,8 +73,9 @@ declar_var ::= type:t l_ident:l SEMICOLON {: RESULT = new DeclarationVari l_ident ::= IDENT:id {: ArrayList<Idf> liste = new ArrayList<Idf>(); liste.add(new Idf(id,"",idleft,idright)); RESULT = liste;:} - | l_ident:idList COMMA IDENT:id {: ArrayList<Idf> idl = new ArrayList<Idf>((Collection<? extends Idf>) idList); + | l_ident:idList COMMA IDENT:id {: ArrayList<Idf> idl = new ArrayList<Idf>((idList)); idl.add(new Idf(id,"",idleft,idright)); + RESULT = idl;:}; type ::= TINTEGER {: RESULT = (new entier());:}