📄 grm.cup
字号:
package Parse;action code {: static Symbol.Symbol sym(String s) { return Symbol.Symbol.symbol(s); } // stampa informazioni utili al debug (se e' attivata l'opzione debug) public void stampaDebug(String stringa) { if(Grm.dflag==1) System.out.println("> " + stringa ); }:};parser code {: public Absyn.Exp parseResult; Lexer lexer; public static int dflag; ErrorMsg.ErrorMsg errorMsg; //-------------------------------------------------------------- // array di nomi per i simboli (token --> stringa per la stampa) public static String symnames[] = new String[60]; static { symnames[sym.EOF] = "EOF"; symnames[sym.error] = "error"; symnames[sym.ID] = "ID"; symnames[sym.STRING] = "STRING"; symnames[sym.INT] = "INT"; symnames[sym.COMMA] = "COMMA"; symnames[sym.COLON] = "COLON"; symnames[sym.SEMICOLON] = "SEMICOLON"; symnames[sym.LPAREN] = "LPAREN"; symnames[sym.RPAREN] = "RPAREN"; symnames[sym.LBRACK] = "LBRACK"; symnames[sym.RBRACK] = "RBRACK"; symnames[sym.LBRACE] = "LBRACE"; symnames[sym.RBRACE] = "RBRACE"; symnames[sym.DOT] = "DOT"; symnames[sym.PLUS] = "PLUS"; symnames[sym.MINUS] = "MINUS"; symnames[sym.UMINUS] = "UMINUS"; symnames[sym.TIMES] = "TIMES"; symnames[sym.DIVIDE] = "DIVIDE"; symnames[sym.EQ] = "EQ"; symnames[sym.NEQ] = "NEQ"; symnames[sym.LT] = "LT"; symnames[sym.LE] = "LE"; symnames[sym.GT] = "GT"; symnames[sym.GE] = "GE"; symnames[sym.AND] = "AND"; symnames[sym.OR] = "OR"; symnames[sym.ASSIGN] = "ASSIGN"; symnames[sym.ARRAY] = "ARRAY"; symnames[sym.IF] = "IF"; symnames[sym.THEN] = "THEN"; symnames[sym.ELSE] = "ELSE"; symnames[sym.WHILE] = "WHILE"; symnames[sym.FOR] = "FOR"; symnames[sym.TO] = "TO"; symnames[sym.DO] = "DO"; symnames[sym.LET] = "LET"; symnames[sym.IN] = "IN"; symnames[sym.END] = "END"; symnames[sym.OF] = "OF"; symnames[sym.BREAK] = "BREAK"; symnames[sym.NIL] = "NIL"; symnames[sym.FUNCTION] = "FUNCTION"; symnames[sym.VAR] = "VAR"; symnames[sym.TYPE] = "TYPE"; } //--------------------------------------------------------- public void syntax_error(java_cup.runtime.Symbol current) { report_error("Errore di sintassi: token \"" + symnames[current.sym] + "\" inaspettato", current); } //--------------------------------------------------------- public void report_error(String message, java_cup.runtime.Symbol info) { // nel caso di EOF devo dare come posizione la pos - 1 if(info.sym == sym.EOF) errorMsg.error(info.left - 1, message); else errorMsg.error(info.left, message); } public Grm(Lexer l, ErrorMsg.ErrorMsg err, int flagdebug) { this(); errorMsg=err; lexer=l; dflag=flagdebug; } //--------------------------------------------------------- // metodi di java_cup.runtime.lr_parser sovrascritti (traduzione in italiano) public void report_fatal_error( String message, Object info) throws java.lang.Exception { /* stop parsing (not really necessary since we throw an exception, but) */ done_parsing(); /* use the normal error message reporting to put out the message */ report_error(message, info); /* throw an exception */ throw new Exception("\nImpossibile recuperare dagli errori precedenti."); } public void unrecovered_syntax_error(java_cup.runtime.Symbol cur_token) throws java.lang.Exception { report_fatal_error("\nImpossibile recuperare dagli errori precedenti", cur_token); } public void report_error(String message, Object info) { System.err.print(message); if (info instanceof java_cup.runtime.Symbol) { if (((java_cup.runtime.Symbol)info).left != -1) { System.err.println(" al carattere " + ((java_cup.runtime.Symbol)info).left + " dell'input"); } else System.err.println(""); } else System.err.println(""); }:};scan with {: return lexer.nextToken(); :};terminal String ID,STRING;terminal Integer INT;terminal COMMA, COLON, SEMICOLON, LPAREN, RPAREN, LBRACK, RBRACK, LBRACE, RBRACE, DOT, PLUS, MINUS, UMINUS, TIMES, DIVIDE, EQ, NEQ, LT, LE, GT, GE, AND, OR, ASSIGN, ARRAY, IF, THEN, ELSE, WHILE, FOR, TO, DO, LET, IN, END, OF, BREAK, NIL, FUNCTION, VAR, TYPE;non terminal Absyn.TypeDec tydec;non terminal Absyn.NameTy namety;non terminal Absyn.ArrayTy arrayty;non terminal Absyn.RecordTy recordty;non terminal Absyn.Exp program;non terminal Absyn.Exp exp,assignexp,opexp,expseq,ifexp,ifelseexp, forexp,whileexp,letexp,opexplog,callexp,recordcreation,arrayexp;non terminal Absyn.Dec dec,vardec;non terminal Absyn.FunctionDec fundec;non terminal Absyn.DecList decs;non terminal Absyn.ExpList argseq;non terminal Integer intexp;non terminal Absyn.Var lvalue;non terminal Absyn.FieldList tyfields,tyrest;non terminal Absyn.Ty typeid;non terminal Absyn.FieldExpList recexp;non terminal Absyn.ExpList explist;precedence left OR;precedence left AND;precedence nonassoc EQ,NEQ,GT,GE,LT,LE;precedence left PLUS, MINUS;precedence left TIMES,DIVIDE;precedence left ELSE,LBRACK;precedence right UMINUS;precedence left FUNCTION,TYPE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -