Escolar Documentos
Profissional Documentos
Cultura Documentos
import java_cup.runtime.*;
%%
%public
%class Lexical
%cup
%line
%column
%full
%{
StringBuffer string = new StringBuffer();
%}
/* comments */
CommentText = ([^*/]|[^*]"/"[^*]|[^/]"*"[^/]|"*"[^/]|"/"[^*])*
EndOfLineComment = "//" {InputCharacter}* {LineTerminator}?
/* identifiers */
Identifier = [:jletter:][:jletterdigit:]*
/* integer literals */
Integer = [0-9]+
%%
<YYINITIAL>{
/* comments */
{EndOfLineComment} { /* ignore */ }
"/*" {yybegin(COMMENT);}
"*/" {
System.out.println("Unmatched end-of-comment: <" + yytext() + ">");
Utility.error(Utility.E_ENDCOMMENT);
}
/* whitespace */
{WhiteSpace} { /* ignore */ }
/*keywords*/
"break" {return symbol(sym.BREAK);}
"char" {return symbol(sym.CHAR);}
"rose" {return symbol(sym.CONST);}
"continue" {return symbol(sym.CONTINUE);}
"bosh" {return symbol(sym.DO);}
"float" {return symbol(sym.FLOAT);}
"wade" {return symbol(sym.FOR);}
"to" {return symbol(sym.TO);}
"kobe" {return symbol(sym.IF);}
"int" {return symbol(sym.INT);}
"bool" {return symbol(sym.INT);}
"fisher" {return symbol(sym.ELSE);}
"inbound" {return symbol(sym.READ);}
"rebound" {return symbol(sym.RETURN);}
"string" {return symbol(sym.STRING);}
"void" {return symbol(sym.VOID);}
"lebron" {return symbol(sym.WHILE);}
"outbound" {return symbol(sym.WRITE);}
/*separators*/
"[" {return symbol(sym.LBRACE);}
"]" {return symbol(sym.RBRACE);}
"(" {return symbol(sym.LPAREN);}
")" {return symbol(sym.RPAREN);}
"{" {return symbol(sym.OPENBRACKET);}
"}" {return symbol(sym.CLOSEBRACKET);}
"," {return symbol(sym.COMMA);}
";" {return symbol(sym.DELIMITER);}
/*operator*/
"=" {return symbol(sym.EQ);}
"+" {return symbol(sym.PLUS);}
"-" {return symbol(sym.MINUS);}
"*" {return symbol(sym.MULT);}
"/" {return symbol(sym.DIV);}
"%" {return symbol(sym.MOD);}
"!" {return symbol(sym.NOT);}
"+=" {return symbol(sym.PLUSEQ);}
"-=" {return symbol(sym.MINUSEQ);}
"/=" {return symbol(sym.DIVEQ);}
"*=" {return symbol(sym.MULTEQ);}
"%=" {return symbol(sym.MODEQ);}
"++" {return symbol(sym.PLUSPLUS);}
"--" {return symbol(sym.MINUSMINUS);}
/*logic*/
"||" {return symbol(sym.OROR);}
"&&" {return symbol(sym.ANDAND);}
/*comparator*/
"==" {return symbol(sym.EQEQ);}
"<=" {return symbol(sym.LTEQ);}
">=" {return symbol(sym.GTEQ);}
">" {return symbol(sym.GT);}
"<" {return symbol(sym.LT);}
"!=" {return symbol(sym.NOTEQ);}
/*identifier*/
{Identifier} {return symbol(sym.IDENTIFIER, yytext());}
/*integer*/
{Integer} {return symbol(sym.INTEGER_LITERAL, new Integer(yytext()));}
/*float*/
{Float} {return symbol(sym.FLOAT_LITERAL, new Float(yytext()));}
/* string literal */
\" { yybegin(STRINGLITERAL); string.setLength(0); }
/* character literal */
\' { yybegin(CHARLITERAL); }
}
<STRINGLITERAL>{
\" {yybegin(YYINITIAL); return symbol(sym.STRING_LITERAL,
string.toString());}
{StringCharacter}+ {string.append(yytext());}
\n {
System.out.println("Unclosed String: <" + string.toString() + ">");
Utility.error(Utility.E_UNCLOSEDSTR);
yybegin(YYINITIAL);
}
/*escape sequences*/
"\\b" {string.append('\b');}
"\\t" {string.append('\t');}
"\\n" {string.append('\n');}
"\\f" { string.append('\f');}
"\\r" {string.append('\r');}
"\\\"" {string.append('\"');}
"\\\\" {string.append('\\');}
<CHARLITERAL>{
{SingleCharacter}\' {yybegin(YYINITIAL); return
symbol(sym.CHARACTER_LITERAL, yytext());}
{SingleCharacter} {
System.out.println("Unclosed Character: <" + yytext() + ">");
Utility.error(Utility.E_UNCLOSEDSTR);
yybegin(YYINITIAL);
}
/*escape sequences*/
"\\b"\' {yybegin(YYINITIAL); return symbol(sym.CHARACTER_LITERAL,
yytext());}
"\\t"\' {yybegin(YYINITIAL); return symbol(sym.CHARACTER_LITERAL,
yytext());}
"\\n"\' {yybegin(YYINITIAL); return symbol(sym.CHARACTER_LITERAL,
yytext());}
"\\f"\' {yybegin(YYINITIAL); return symbol(sym.CHARACTER_LITERAL,
yytext());}
"\\r"\' {yybegin(YYINITIAL); return symbol(sym.CHARACTER_LITERAL,
yytext());}
"\\'"\' {yybegin(YYINITIAL); return symbol(sym.CHARACTER_LITERAL,
yytext());}
"\\\\"\' {yybegin(YYINITIAL); return symbol(sym.CHARACTER_LITERAL,
yytext());}
<COMMENT> {
"*/" {yybegin(YYINITIAL); }
{CommentText} {/* ignore */ }
}
.{
System.out.println("Illegal character: <" + yytext() + ">");
Utility.error(Utility.E_UNMATCHED);
}
PARSER
package compile.lexicalanalyzer;
import java_cup.runtime.*;
import java.io.Reader;
parser code{:
compilation_unit ::=
constant_declaration_opt
method_declarations
;
variable_declarators ::=
variable_declarator
| variable_declarators COMMA variable_declarator
;
variable_declarator ::=
variable_declarator_id
| variable_declarator_id EQ variable_initializer
;
variable_declarator_id ::=
IDENTIFIER
;
variable_initializer ::=
expression
| array_initializer
;
method_declaration ::=
method_header method_body
;
method_header ::=
returntype method_declarator
| VOID method_declarator
;
method_declarator ::=
IDENTIFIER LPAREN formal_parameter_list_opt RPAREN
;
formal_parameter_list_opt ::=
| formal_parameter_list
;
formal_parameter_list ::=
formal_parameter
| formal_parameter_list COMMA formal_parameter
;
formal_parameter ::=
returntype variable_declarator_id
;
expression_statement ::=
statement_expression DELIMITER
;
statement_expression ::=
assignment
| preincrement_expression
| predecrement_expression
| postincrement_expression
| postdecrement_expression
| method_invocation
;
if_then_statement ::=
IF LPAREN expression RPAREN statement
;
if_then_else_statement ::=
IF LPAREN expression RPAREN statement_no_short_if
ELSE statement
;
if_then_else_statement_no_short_if ::=
IF LPAREN expression RPAREN statement_no_short_if
ELSE statement_no_short_if
;
while_statement ::=
WHILE LPAREN expression RPAREN statement
;
while_statement_no_short_if ::=
WHILE LPAREN expression RPAREN statement_no_short_if
;
until_statement ::=
UNTIL LPAREN expression RPAREN statement
;
until_statement_no_short_if ::=
UNTIL LPAREN expression RPAREN statement_no_short_if
;
do_statement ::=
DO statement WHILE LPAREN expression RPAREN DELIMITER
;
do_until_statement ::=
DO statement UNTIL LPAREN expression RPAREN DELIMITER
;
for_statement ::=
FOR LPAREN for_init_opt TO expression DELIMITER
for_update_opt RPAREN statement
;
for_statement_no_short_if ::=
FOR LPAREN for_init_opt TO expression DELIMITER
for_update_opt RPAREN statement_no_short_if
;
for_init_opt ::=
| for_init
;
for_init ::= statement_expression_list
| local_variable_declaration
;
for_update_opt ::=
| for_update
;
for_update ::= statement_expression_list
;
statement_expression_list ::=
statement_expression
| statement_expression_list COMMA statement_expression
;
identifier_opt ::=
| IDENTIFIER
;
break_statement ::=
BREAK identifier_opt DELIMITER
;
continue_statement ::=
CONTINUE identifier_opt DELIMITER
;
return_statement ::=
RETURN expression_opt DELIMITER
;
primary ::=
literal
| LPAREN expression RPAREN
| method_invocation
| array_access
;
argument_list_opt ::=
| argument_list
;
argument_list ::=
expression
| argument_list COMMA expression
;
dim_exprs ::= dim_expr
| dim_exprs dim_expr
;
dim_expr ::= LBRACE expression RBRACE
;
method_invocation ::=
name LPAREN argument_list_opt RPAREN
;
array_access ::=
name LBRACE expression RBRACE
| primary LBRACE expression RBRACE
;
postfix_expression ::=
primary
| name
| postincrement_expression
| postdecrement_expression
;
postincrement_expression ::=
postfix_expression PLUSPLUS
;
postdecrement_expression ::=
postfix_expression MINUSMINUS
;
unary_expression ::=
preincrement_expression
| predecrement_expression
| PLUS unary_expression
| MINUS unary_expression
| unary_expression_not_plus_minus
;
preincrement_expression ::=
PLUSPLUS unary_expression
;
predecrement_expression ::=
MINUSMINUS unary_expression
;
unary_expression_not_plus_minus ::=
postfix_expression
| NOT unary_expression
;
multiplicative_expression ::=
unary_expression
| multiplicative_expression MULT unary_expression
| multiplicative_expression DIV unary_expression
| multiplicative_expression MOD unary_expression
;
additive_expression ::=
multiplicative_expression
| additive_expression PLUS multiplicative_expression
| additive_expression MINUS multiplicative_expression
;
relational_expression ::=
additive_expression
| relational_expression LT additive_expression
| relational_expression GT additive_expression
| relational_expression LTEQ additive_expression
| relational_expression GTEQ additive_expression
;
equality_expression ::=
relational_expression
| equality_expression EQEQ relational_expression
| equality_expression NOTEQ relational_expression
;
conditional_and_expression ::=
equality_expression
| conditional_and_expression ANDAND equality_expression
;
conditional_or_expression ::=
conditional_and_expression
| conditional_or_expression OROR conditional_and_expression
;
assignment_expression ::=
conditional_or_expression
| assignment
;
assignment ::= left_hand_side assignment_operator
assignment_expression
;
left_hand_side ::=
name
| array_access
;
assignment_operator ::=
EQ
| MULTEQ
| DIVEQ
| MODEQ
| PLUSEQ
| MINUSEQ
;
expression_opt ::=
| expression
;
expression ::= assignment_expression
;
constant_expression ::=
expression
;
- .cnba