Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* JFlex example: part of Java language lexer specification */
- package it.unisa.compilatori.jflex;
- import java_cup.runtime.*;
- import it.unisa.compilatori.jflex.*;
- import java.lang.*;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.Set;
- import java.util.HashSet;
- %%
- %class Lexer
- %unicode
- %cupsym Sym
- %cup
- %line
- %column
- %{
- HashMap<String,SymbolCustom> symbolTable = new HashMap<>();
- Set<Character> SEPARATORS;
- StringBuffer string = new StringBuffer();
- private SymbolCustom symbol(int type, String name) {
- return new SymbolCustom(type, name, yyline, yycolumn);
- }
- private SymbolCustom symbol(int type, String name, Object value) {
- return new SymbolCustom(type, name, yyline, yycolumn, value);
- }
- private void populateKeyWord(){
- symbolTable.put("if", symbol(Sym.IF_KEYWORD,"if"));
- symbolTable.put("then", symbol(Sym.THEN_KEYWORD,"then"));
- symbolTable.put("else", symbol(Sym.ELSE_KEYWORD,"else"));
- symbolTable.put("while", symbol(Sym.WHILE_KEYWORD,"while"));
- symbolTable.put("int", symbol(Sym.INT_KEYWORD,"int"));
- symbolTable.put("float",symbol(Sym.FLOAT_KEYWORD,"float"));
- symbolTable.put("function",symbol(Sym.FUNCTION_KEYWORD,"function"));
- symbolTable.put("main",symbol(Sym.MAIN_KEYWORD,"main"));
- symbolTable.put("end",symbol(Sym.END_KEYWORD,"end"));
- symbolTable.put("do",symbol(Sym.DO_KEYWORD,"do"));
- symbolTable.put("local",symbol(Sym.LOCAL_KEYWORD,"local"));
- symbolTable.put("return",symbol(Sym.RETURN_KEYWORD,"return"));
- symbolTable.put("for",symbol(Sym.FOR_KEYWORD,"for"));
- symbolTable.put("nil",symbol(Sym.NIL_CONST,"nil"));
- symbolTable.put("bool",symbol(Sym.BOOL_KEYWORD,"bool"));
- symbolTable.put("string",symbol(Sym.STRING_KEYWORD,"string"));
- symbolTable.put("nop",symbol(Sym.NOP_CONST,"nop"));
- symbolTable.put("true",symbol(Sym.TRUE_KEYWORD,"true"));
- symbolTable.put("false",symbol(Sym.FALSE_KEYWORD,"false"));
- symbolTable.put("not",symbol(Sym.NOT_RELOP,"not"));
- symbolTable.put("global",symbol(Sym.GLOBAL_KEYWORD,"global"));
- symbolTable.put("and",symbol(Sym.AND_RELOP,"and"));
- symbolTable.put("or", symbol(Sym.OR_RELOP, "or"));
- }
- private void populateSeparators() {
- Character[] SEPARS = new Character[] {';', ',', '(', ')', '{', '}'};
- SEPARATORS = new HashSet<>(Arrays.asList(SEPARS));
- }
- private void installIdentifier(String lessema){
- if(symbolTable.containsKey(lessema))
- return;
- symbolTable.put(lessema, symbol(Sym.IDENTIFIER,"id",lessema));
- }
- private void installIntegerNumber(String lessema){
- if (symbolTable.containsKey(lessema))
- return;
- symbolTable.put(lessema, symbol(Sym.INTEGER_CONST,"INTEGER_CONST",lessema));
- }
- private void installFloatNumber(String lessema){
- if (symbolTable.containsKey(lessema))
- return;
- symbolTable.put(lessema, symbol(Sym.FLOAT_CONST,"FLOAT_CONST",lessema));
- }
- private void installString(String lessema){
- if(symbolTable.containsKey(lessema))
- return;
- symbolTable.put(lessema,symbol(Sym.STRING_CONST,"STRING_CONST",lessema));
- }
- %}
- %init{
- populateKeyWord();
- //populateSeparators();
- %init}
- LineTerminator = \r|\n|\r\n
- //InputCharacter = [^\r\n]
- WhiteSpace = {LineTerminator} | [ \t\f\n]
- Identifier = [:jletter:] [:jletterdigit:]*
- //Expo = ([eE][-+]?(0 | [1-9] [0-9]*))
- DecIntegerConstant = 0 | [+-]?[1-9][0-9]*
- DecFloatConstant = [-+]?(0 | [1-9][0-9]*)\.( [0] | [0-9]*[1-9])
- %state STRING_CONST
- %%
- /* keywords */
- <YYINITIAL> "if" { return symbol(Sym.IF_KEYWORD,"IF");}
- <YYINITIAL> "then" { return symbol(Sym.THEN_KEYWORD,"THEN"); }
- <YYINITIAL> "else" { return symbol(Sym.ELSE_KEYWORD,"ELSE"); }
- <YYINITIAL> "while" { return symbol(Sym.WHILE_KEYWORD,"WHILE"); }
- <YYINITIAL> "int" { return symbol(Sym.INT_KEYWORD,"INT"); }
- <YYINITIAL> "float" { return symbol(Sym.FLOAT_KEYWORD,"FLOAT"); }
- <YYINITIAL> "function" { return symbol(Sym.FUNCTION_KEYWORD,"FUNCTION"); }
- <YYINITIAL> "main" { return symbol(Sym.MAIN_KEYWORD,"MAIN"); }
- <YYINITIAL> "end" { return symbol(Sym.END_KEYWORD,"END"); }
- <YYINITIAL> "do" { return symbol(Sym.DO_KEYWORD,"DO"); }
- <YYINITIAL> "local" { return symbol(Sym.LOCAL_KEYWORD,"LOCAL"); }
- <YYINITIAL> "return" { return symbol(Sym.RETURN_KEYWORD,"RETURN"); }
- <YYINITIAL> "for" { return symbol(Sym.FOR_KEYWORD,"FOR"); }
- <YYINITIAL> "nil" { return symbol(Sym.NIL_CONST,"NIL"); }
- <YYINITIAL> "bool" { return symbol(Sym.BOOL_KEYWORD,"BOOL"); }
- <YYINITIAL> "string" { return symbol(Sym.STRING_CONST,"STRING"); }
- <YYINITIAL> "nop" { return symbol(Sym.NOP_CONST,"NOP"); }
- <YYINITIAL> "true" { return symbol(Sym.TRUE_CONST,"TRUE"); }
- <YYINITIAL> "false" { return symbol(Sym.FALSE_CONST,"FALSE"); }
- <YYINITIAL> "global" { return symbol(Sym.GLOBAL_KEYWORD,"GLOBAL"); }
- <YYINITIAL> "!=" { return symbol(Sym.NE_OP,"NEQUAL"); }
- <YYINITIAL> {
- /* operators */
- "=" {return symbol(Sym.ASSIGN, "ASSIGN"); }
- "and" {return symbol(Sym.AND_RELOP, "AND"); }
- "or" {return symbol(Sym.OR_RELOP,"OR");}
- ">" {return symbol(Sym.GT_RELOP, "GT", ">"); }
- ">=" {return symbol(Sym.GE_RELOP, "GE", ">="); }
- "<" {return symbol(Sym.LT_RELOP, "LT", "<"); }
- "<=" {return symbol(Sym.LE_RELOP, "LE", "<="); }
- "==" {return symbol(Sym.IE_RELOP, "IE", "=="); }
- "not" {return symbol(Sym.NOT_RELOP, "NOT"); }
- "#" {return symbol(Sym.SHAR_RELOP,"SHARP");}
- "+" {return symbol(Sym.PLUS_OP,"PLUS");}
- "-" {return symbol(Sym.MINUS_OP,"MINUS");}
- "*" {return symbol(Sym.TIMES_OP,"TIMES");}
- "/" {return symbol(Sym.DIV_OP,"DIV");}
- "<==" {return symbol(Sym.READ,"READ");}
- "==>" {return symbol(Sym.WRITE,"WRITE");}
- "!=" {return symbol(Sym.NE_OP,"NEQUAL");}
- /* identifiers */
- {Identifier} {
- installIdentifier(yytext());
- return symbol(Sym.IDENTIFIER,"ID",yytext());
- }
- /* CONSTANTS */
- {DecFloatConstant} {
- installFloatNumber(yytext());
- return symbol(Sym.FLOAT_CONST, "FLOAT_CONST",yytext());
- }
- {DecIntegerConstant} {
- installIntegerNumber(yytext());
- return symbol(Sym.INTEGER_CONST, "INTEGER_CONST",yytext());
- }
- \" {
- string.setLength(0);
- yybegin(STRING_CONST);
- }
- /* whitespace */
- {WhiteSpace} { /* ignore */ }
- /* Separators */
- ";" {return symbol(Sym.SEMI_DEL, "SEMI", ";"); }
- "," {return symbol(Sym.COMMA_DEL, "COMMA", ","); }
- "(" {return symbol(Sym.OPEN_ROUND_BRACKET_DEL, "LPAR", "("); }
- ")" {return symbol(Sym.CLOSE_ROUND_BRACKET_DEL, "RPAR", ")"); }
- ":" {return symbol(Sym.COLON_DEL, "COLON", ":"); }
- "{" {return symbol(Sym.OPEN_CURLY_DEL, "BLPAR", "\u007B"); }
- "}" {return symbol(Sym.CLOSE_CURLY_DEL, "BRPAR", "\u007D"); }
- "[" {return symbol(Sym.OPEN_SQUARE_BRACKET_DEL, "SLPAR", "\u005B"); }
- "]" {return symbol(Sym.CLOSE_SQUARE_BRACKET_DEL, "SRPAR", "\u005D"); }
- }
- <STRING_CONST> {
- \" {
- yybegin(YYINITIAL);
- installString(string.toString());
- return symbol(Sym.STRING_CONST,"STRING_CONST",string.toString());
- }
- [^\n\r\"\\]+ { string.append( yytext() ); }
- \\t { string.append('\t'); }
- \\n { string.append('\n'); }
- \\r { string.append('\r'); }
- \\\" { string.append('\"'); }
- \\ { string.append('\\'); }
- }
- /* error fallback */
- [^] { throw new Error("Illegal character <"+yytext()+">,line: " + yyline + " column: " + yycolumn); }
- <<EOF>> {return new SymbolCustom(Sym.EOF,"EOF");}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement