Skip to content

Instantly share code, notes, and snippets.

@benmezger
Last active June 28, 2020 02:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benmezger/68d6a59832a101707a825592c700ab5b to your computer and use it in GitHub Desktop.
Save benmezger/68d6a59832a101707a825592c700ab5b to your computer and use it in GitHub Desktop.
/* LanguageParser.java */
/* Generated By:JavaCC: Do not edit this line. LanguageParser.java */
package compiler.parser;
import javax.swing.text.html.parser.Parser;
import java.util.List;
import java.util.ArrayList;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.lang.StringBuilder;
import java.lang.StringBuilder;
public class LanguageParser implements LanguageParserConstants {
int contParseError = 0;
boolean debugRecovery = true;
final static List<ErrorStruct> output = new ArrayList<ErrorStruct>();
boolean eof;
static List<String> listaComandos = new ArrayList<String>();
static List<String> listaParametros = new ArrayList<String>();
static LanguageRules regraDasLinguagem = new LanguageRules();
static VirtualMachine maquina;
static Instruction instrucoes;
public LanguageParser LanguageParser(String code){
this.checkSyntax(code);
return this;
}
final public void adicionar_regra(String regra, List<String> lista_parametros_dentro_funcao) throws ParseException {
switch(regra){
case "#1":
regraDasLinguagem.regra1(lista_parametros_dentro_funcao.get(0));
for(Instruction instrucao: regraDasLinguagem.getPilha_de_instrucoes()){
System.out.println(instrucao.getPonteiro() + " | " + instrucao.getInstrucao() + " | " + instrucao.getEndereco());
}
System.out.println("\n\n");
for(SymbolTable tabelaSimbolo: regraDasLinguagem.getPilha_de_simbolos()){
System.out.println(tabelaSimbolo.getIdentificador() + " | " + tabelaSimbolo.getCategoria() + " | " +
tabelaSimbolo.getAtributo1() + " | " + tabelaSimbolo.getAtributo2());
}
break;
case "#2":
regraDasLinguagem.regra2();
break;
case "#3":
regraDasLinguagem.regra3();
break;
case "#4":
regraDasLinguagem.regra4(lista_parametros_dentro_funcao.get(0));
break;
case "#5":
regraDasLinguagem.regra5();
break;
case "#6":
regraDasLinguagem.regra6();
break;
case "#7":
regraDasLinguagem.regra7();
break;
case "#8":
regraDasLinguagem.regra8();
break;
case "#9":
regraDasLinguagem.regra9();
break;
case "#10":
regraDasLinguagem.regra10(lista_parametros_dentro_funcao.get(0));
break;
case "#11":
regraDasLinguagem.regra11(lista_parametros_dentro_funcao.get(0));
break;
case "#12":
regraDasLinguagem.regra12();
break;
case "#13":
regraDasLinguagem.regra13(Integer.parseInt(lista_parametros_dentro_funcao.get(0)));
break;
case "#14":
regraDasLinguagem.regra14();
break;
case "#15":
regraDasLinguagem.regra15();
break;
case "#16":
regraDasLinguagem.regra16();
break;
case "#17":
regraDasLinguagem.regra17();
break;
case "#18":
regraDasLinguagem.regra18(lista_parametros_dentro_funcao.get(0));
break;
case "#19":
regraDasLinguagem.regra19();
break;
case "#20":
regraDasLinguagem.regra20(Integer.parseInt(lista_parametros_dentro_funcao.get(0)));
break;
case "#21":
regraDasLinguagem.regra21(Float.parseFloat(lista_parametros_dentro_funcao.get(0)));
break;
case "#22":
regraDasLinguagem.regra22(lista_parametros_dentro_funcao.get(0));
break;
case "#23":
regraDasLinguagem.regra23();
break;
case "#24":
regraDasLinguagem.regra24();
break;
case "#25":
regraDasLinguagem.regra25();
break;
case "#26":
regraDasLinguagem.regra26();
break;
case "#27":
regraDasLinguagem.regra27();
break;
case "#28":
regraDasLinguagem.regra28();
break;
case "#29":
regraDasLinguagem.regra29();
break;
case "#30":
regraDasLinguagem.regra30();
break;
case "#31":
regraDasLinguagem.regra31();
break;
case "#32":
regraDasLinguagem.regra32();
break;
case "#33":
regraDasLinguagem.regra33();
break;
case "#34":
regraDasLinguagem.regra34();
break;
case "#35":
regraDasLinguagem.regra35();
break;
case "#36":
regraDasLinguagem.regra36();
break;
case "#37":
regraDasLinguagem.regra37();
break;
case "#38":
regraDasLinguagem.regra38();
break;
case "#39":
regraDasLinguagem.regra39();
break;
case "#40":
regraDasLinguagem.regra40();
break;
case "#41":
regraDasLinguagem.regra41();
break;
case "#42":
regraDasLinguagem.regra42();
break;
case "#43":
regraDasLinguagem.regra43();
break;
case "#44":
regraDasLinguagem.regra44();
break;
case "#45":
regraDasLinguagem.regra45();
break;
case "#46":
regraDasLinguagem.regra46();
break;
case "#47":
regraDasLinguagem.regra47();
break;
case "#48":
regraDasLinguagem.regra48();
break;
case "#49":
regraDasLinguagem.regra49();
break;
default :
break;
}
}
public static List<Token> getTokens(String stream){
InputStream target = new ByteArrayInputStream(stream.getBytes());
LanguageParser parser = new LanguageParser(target);
return tokenize(parser);
}
public static ArrayList<ErrorStruct> checkSyntax(String stream) {
InputStream target = new ByteArrayInputStream(stream.getBytes());
LanguageParser parser = new LanguageParser(target);
try {
parser.begin_program();
}
catch (ParseException e){
output.add(new ErrorStruct("Error parsing the program.\n", e));
}
ArrayList tmp = new ArrayList<ErrorStruct>(output);
output.clear();
return tmp;
}
public static LanguageParser create(String stream){
InputStream target = new ByteArrayInputStream(stream.getBytes());
LanguageParser parser = new LanguageParser(target);
return parser;
}
public static void main(String args[]) throws TokenMgrError, ParseException {
LanguageParser parser = null;
if (args.length == 0) {
parser = new LanguageParser(System.in);
}
else if (args.length == 1) {
try {
parser = new LanguageParser(new java.io.FileInputStream(args[0]));
}
catch (java.io.FileNotFoundException e) {
System.out.println("LanguageParser: file " + args[0] + " was not found.");
return;
}
}
//for (Token token: tokenize(parser)){
// String name = LanguageParserConstants.tokenImage[token.kind];
// System.out.println("Line " + token.beginLine + " | Column " + token.beginColumn + " | " + token + "\n");
//}
}
public static List<Token> tokenize(LanguageParser parser){
List<Token> tokens = new ArrayList<Token>();
Token token = parser.getNextToken();
while (token.kind != LanguageParserConstants.EOF){
tokens.add(token);
token = parser.getNextToken();
}
if (!TokenHandler.isClosed()){
tokens.add(TokenHandler.createToken());
}
return tokens;
}
static public String im(int x){
String s = tokenImage[x];
int k = s.lastIndexOf("\"");
try {
s = s.substring(1, k);
}
catch (StringIndexOutOfBoundsException e){}
return s;
}
public void consumeUntil(RecoverySet g, ParseException e, String met) throws ParseException {
Token tok;
if (g == null){
throw e;
}
tok = getToken(1); // Current token
while (!eof){
/* found a token in set */
if (g.contains(tok.kind)) {
break;
}
getNextToken();
tok = getToken(1);
if (tok.kind == EOF && !g.contains(EOF)){
eof = true;
}
}
contParseError++;
}
final public void enum_values() throws ParseException {
trace_call("enum_values");
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case NUM:
case NUMBER_REAL:
case STRING_LITERAL:{
constant_result();
break;
}
case IDENTIFIER:{
jj_consume_token(IDENTIFIER);
break;
}
default:
jj_la1[0] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
adicionar_regra("#4", listaParametros);
listaParametros.remove(token.image);
} finally {
trace_return("enum_values");
}
}
final public void inner_enum_declaration(RecoverySet r) throws ParseException {
trace_call("inner_enum_declaration");
try {
try {
jj_consume_token(IDENTIFIER);
adicionar_regra("#3");
jj_consume_token(IS);
enum_values();
inner_enum_decla_cont();
jj_consume_token(DOT);
} catch (ParseException e) {
consumeUntil(r, e, "Error: Invalid enum declaration syntax.");
output.add(new ErrorStruct("Erro: declaracao de enum interna incorreta.\n", e));
}
} finally {
trace_return("inner_enum_declaration");
}
}
final public void inner_enum_decla_cont() throws ParseException {
trace_call("inner_enum_decla_cont");
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA:{
jj_consume_token(COMMA);
enum_values();
inner_enum_decla_cont();
break;
}
default:
jj_la1[1] = jj_gen;
;
}
} finally {
trace_return("inner_enum_decla_cont");
}
}
final public void enum_declaration(RecoverySet r) throws ParseException {
trace_call("enum_declaration");
try {
try {
jj_consume_token(TYPE);
jj_consume_token(OPEN_BRACKET);
label_1:
while (true) {
inner_enum_declaration(r);
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IDENTIFIER:{
;
break;
}
default:
jj_la1[2] = jj_gen;
break label_1;
}
}
jj_consume_token(CLOSE_BRACKET);
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case DECLARATION:{
jj_consume_token(DECLARATION);
declaration_constants_and_variables(r);
break;
}
default:
jj_la1[3] = jj_gen;
;
}
} catch (ParseException e) {
consumeUntil(r, e, "Error: Invalid enum declaration syntax.");
output.add(new ErrorStruct("Erro: declaracao de enum incorreta.\n", e));
}
} finally {
trace_return("enum_declaration");
}
}
final public void identifiers() throws ParseException {
trace_call("identifiers");
try {
jj_consume_token(IDENTIFIER);
adicionar_regra("#10");
index();
adicionar_regra("#25");
} finally {
trace_return("identifiers");
}
}
final public void identifiers_list() throws ParseException {
trace_call("identifiers_list");
try {
try {
identifiers();
label_2:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA:{
;
break;
}
default:
jj_la1[4] = jj_gen;
break label_2;
}
jj_consume_token(COMMA);
identifiers();
}
} catch (ParseException e) {
output.add(new ErrorStruct("Erro: Lista de identificadores incorreto.\n", e));
}
} finally {
trace_return("identifiers_list");
}
}
final public void type_declaration() throws ParseException {
trace_call("type_declaration");
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case INTEGER:{
jj_consume_token(INTEGER);
adicionar_regra("#13");
break;
}
case REAL:{
jj_consume_token(REAL);
adicionar_regra("#14");
break;
}
case STRING:{
jj_consume_token(STRING);
adicionar_regra("#15");
break;
}
case LOGIC:{
jj_consume_token(LOGIC);
adicionar_regra("#16");
break;
}
case ENUM:{
jj_consume_token(ENUM);
adicionar_regra("#17");
break;
}
default:
jj_la1[5] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} finally {
trace_return("type_declaration");
}
}
final public void variable_declaration() throws ParseException {
trace_call("variable_declaration");
try {
identifiers_list();
jj_consume_token(IS);
type_declaration();
adicionar_regra("#6");
jj_consume_token(DOT);
} finally {
trace_return("variable_declaration");
}
}
final public void type_constant() throws ParseException {
trace_call("type_constant");
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case INTEGER:{
jj_consume_token(INTEGER);
break;
}
case REAL:{
jj_consume_token(REAL);
break;
}
case STRING:{
jj_consume_token(STRING);
break;
}
case LOGIC:{
jj_consume_token(LOGIC);
break;
}
default:
jj_la1[6] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} finally {
trace_return("type_constant");
}
}
final public void end_constant() throws ParseException {
trace_call("end_constant");
try {
jj_consume_token(AS);
jj_consume_token(CONSTANT);
adicionar_regra("#5");
label_3:
while (true) {
constant_declaration();
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IDENTIFIER:{
;
break;
}
default:
jj_la1[7] = jj_gen;
break label_3;
}
}
} finally {
trace_return("end_constant");
}
}
final public void start_variable() throws ParseException {
trace_call("start_variable");
try {
jj_consume_token(VARIABLE);
adicionar_regra("#8");
label_4:
while (true) {
variable_declaration();
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IDENTIFIER:{
;
break;
}
default:
jj_la1[8] = jj_gen;
break label_4;
}
}
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case AS:{
end_constant();
break;
}
default:
jj_la1[9] = jj_gen;
;
}
} finally {
trace_return("start_variable");
}
}
final public void constant_declaration() throws ParseException {
trace_call("constant_declaration");
try {
identifiers_list();
jj_consume_token(IS);
type_constant();
adicionar_regra("#6");
jj_consume_token(ASSIGN);
constant_result();
adicionar_regra("#7");
jj_consume_token(DOT);
} finally {
trace_return("constant_declaration");
}
}
final public void end_variable() throws ParseException {
trace_call("end_variable");
try {
jj_consume_token(AS);
jj_consume_token(VARIABLE);
adicionar_regra("#8");
label_5:
while (true) {
variable_declaration();
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IDENTIFIER:{
;
break;
}
default:
jj_la1[10] = jj_gen;
break label_5;
}
}
} finally {
trace_return("end_variable");
}
}
final public void start_constant() throws ParseException {
trace_call("start_constant");
try {
jj_consume_token(CONSTANT);
adicionar_regra("#5");
label_6:
while (true) {
constant_declaration();
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IDENTIFIER:{
;
break;
}
default:
jj_la1[11] = jj_gen;
break label_6;
}
}
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case AS:{
end_variable();
break;
}
default:
jj_la1[12] = jj_gen;
;
}
} finally {
trace_return("start_constant");
}
}
final public void start_declaration(RecoverySet r) throws ParseException {
trace_call("start_declaration");
try {
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case VARIABLE:{
start_variable();
break;
}
case CONSTANT:{
start_constant();
break;
}
default:
jj_la1[13] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} catch (ParseException e) {
consumeUntil(r, e, "Error: Invalid declaration body.\n");
output.add(new ErrorStruct("Erro: Declarac\u00e3o de variavel/constante errado.\n", e));
}
} finally {
trace_return("start_declaration");
}
}
final public void inner_declaration(RecoverySet r) throws ParseException {
trace_call("inner_declaration");
try {
try {
jj_consume_token(AS);
adicionar_regra("#5");
start_declaration(r);
} catch (ParseException e) {
consumeUntil(r, e, "Error: Invalid declaration body.\n");
output.add(new ErrorStruct("Error: Bad inner declaration of as.\n", e));
}
} finally {
trace_return("inner_declaration");
}
}
final public void declaration_constants_and_variables(RecoverySet r) throws ParseException {
trace_call("declaration_constants_and_variables");
try {
try {
jj_consume_token(CONSTANT);
jj_consume_token(AND);
jj_consume_token(VARIABLE);
jj_consume_token(OPEN_BRACKET);
inner_declaration(r);
jj_consume_token(CLOSE_BRACKET);
} catch (ParseException e) {
consumeUntil(r, e, "declaration_constants_and_variables");
output.add(new ErrorStruct("Error: Forma geral de declarac\u00e3o de constante e variaval incorreta.\n", e));
}
} finally {
trace_return("declaration_constants_and_variables");
}
}
final public void constant_result() throws ParseException {
trace_call("constant_result");
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case STRING_LITERAL:{
jj_consume_token(STRING_LITERAL);
adicionar_regra("#28");
break;
}
case NUM:{
jj_consume_token(NUM);
adicionar_regra("#26");
break;
}
case NUMBER_REAL:{
jj_consume_token(NUMBER_REAL);
adicionar_regra("#27");
break;
}
default:
jj_la1[14] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} finally {
trace_return("constant_result");
}
}
final public void logic_result(RecoverySet r) throws ParseException {
trace_call("logic_result");
try {
RecoverySet g = new RecoverySet(CLOSE_BRACKET);
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case TRUE:{
jj_consume_token(TRUE);
jj_consume_token(RESULT);
adicionar_regra("#30");
jj_consume_token(OPEN_BRACKET);
list_of_commands(g);
jj_consume_token(CLOSE_BRACKET);
true_result_cont();
break;
}
case UNTRUE:{
jj_consume_token(UNTRUE);
jj_consume_token(RESULT);
adicionar_regra("#31");
jj_consume_token(OPEN_BRACKET);
list_of_commands(g);
jj_consume_token(CLOSE_BRACKET);
untrue_result_cont();
break;
}
default:
jj_la1[15] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} catch (ParseException e) {
consumeUntil(r, e, "");
output.add(new ErrorStruct("Erro: Verifica\u00e7\u00e3o de resultado logico incorreto.\n", e));
}
} finally {
trace_return("logic_result");
}
}
final public void true_result_cont() throws ParseException {
trace_call("true_result_cont");
try {
RecoverySet g = new RecoverySet(CLOSE_BRACKET);
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case UNTRUE:{
jj_consume_token(UNTRUE);
jj_consume_token(RESULT);
adicionar_regra("#32");
jj_consume_token(OPEN_BRACKET);
list_of_commands(g);
jj_consume_token(CLOSE_BRACKET);
jj_consume_token(DOT);
break;
}
case DOT:{
jj_consume_token(DOT);
break;
}
default:
jj_la1[16] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} catch (ParseException e) {
consumeUntil(g, e, "list_of_commands");
output.add(new ErrorStruct("Erro: Clausula de teste incorreta.\n", e));
}
} finally {
trace_return("true_result_cont");
}
}
final public void untrue_result_cont() throws ParseException {
trace_call("untrue_result_cont");
try {
RecoverySet g = new RecoverySet(CLOSE_BRACKET);
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case TRUE:{
jj_consume_token(TRUE);
jj_consume_token(RESULT);
adicionar_regra("#32");
jj_consume_token(OPEN_BRACKET);
list_of_commands(g);
jj_consume_token(CLOSE_BRACKET);
jj_consume_token(DOT);
break;
}
case DOT:{
jj_consume_token(DOT);
break;
}
default:
jj_la1[17] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} catch (ParseException e) {
consumeUntil(g, e, "");
output.add(new ErrorStruct("Erro: Clausula de teste incorreta.\n", e));
}
} finally {
trace_return("untrue_result_cont");
}
}
final public void declarations(RecoverySet r) throws ParseException {
trace_call("declarations");
try {
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case DECLARATION:{
jj_consume_token(DECLARATION);
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case TYPE:{
enum_declaration(r);
break;
}
case CONSTANT:{
declaration_constants_and_variables(r);
break;
}
default:
jj_la1[18] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
break;
}
default:
jj_la1[19] = jj_gen;
;
}
} catch (ParseException e) {
consumeUntil(r, e, "declarations");
output.add(new ErrorStruct("Erro de declara\u00e7\u00e3o de enum/variable\n", e));
}
} finally {
trace_return("declarations");
}
}
final public void list_of_commands(RecoverySet r) throws ParseException {
trace_call("list_of_commands");
try {
RecoverySet g = First.list_of_commands ;
try {
label_7:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case REPEAT:{
repeat(g);
break;
}
case AVALIATE:{
avaliate(g);
break;
}
case WRITE:{
jj_consume_token(WRITE);
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case THIS:{
write(g);
break;
}
case ALL:{
write_all(g);
break;
}
default:
jj_la1[20] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
break;
}
case DESIGNATE:{
designate(g);
break;
}
case READ:{
read(g);
break;
}
default:
jj_la1[21] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case DESIGNATE:
case READ:
case WRITE:
case AVALIATE:
case REPEAT:{
;
break;
}
default:
jj_la1[22] = jj_gen;
break label_7;
}
}
} catch (ParseException e) {
consumeUntil(r, e, "list_of_commands");
output.add(new ErrorStruct("Erro: Declara\u00e7\u00e3o de comando incorreta.\n", e));
}
} finally {
trace_return("list_of_commands");
}
}
final public void expression(RecoverySet g) throws ParseException {
trace_call("expression");
try {
try {
arithmetic_or_logic_expression(g);
expression_cont(g);
} catch (ParseException e) {
consumeUntil(g, e, "list_of_commands");
output.add(new ErrorStruct("Erro: Express\u00e3o incorreta.\n", e));
}
} finally {
trace_return("expression");
}
}
final public void arithmetic_or_logic_expression(RecoverySet g) throws ParseException {
trace_call("arithmetic_or_logic_expression");
try {
second_term(g);
lesser_priority_operators(g);
} finally {
trace_return("arithmetic_or_logic_expression");
}
}
final public void expression_cont(RecoverySet g) throws ParseException {
trace_call("expression_cont");
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case EQUAL_TO:
case DIFF_THAN:
case LESS_THAN:
case GREATER_THAN:
case LESS_THAN_OR_EQ_TO:
case GREATER_THAN_OR_EQ_TO:{
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case EQUAL_TO:{
jj_consume_token(EQUAL_TO);
arithmetic_or_logic_expression(g);
adicionar_regra("#36");
break;
}
case DIFF_THAN:{
jj_consume_token(DIFF_THAN);
arithmetic_or_logic_expression(g);
adicionar_regra("#37");
break;
}
case LESS_THAN:{
jj_consume_token(LESS_THAN);
arithmetic_or_logic_expression(g);
adicionar_regra("#38");
break;
}
case GREATER_THAN:{
jj_consume_token(GREATER_THAN);
arithmetic_or_logic_expression(g);
adicionar_regra("#39");
break;
}
case LESS_THAN_OR_EQ_TO:{
jj_consume_token(LESS_THAN_OR_EQ_TO);
arithmetic_or_logic_expression(g);
adicionar_regra("#40");
break;
}
case GREATER_THAN_OR_EQ_TO:{
jj_consume_token(GREATER_THAN_OR_EQ_TO);
arithmetic_or_logic_expression(g);
adicionar_regra("#41");
break;
}
default:
jj_la1[23] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
break;
}
default:
jj_la1[24] = jj_gen;
;
}
} finally {
trace_return("expression_cont");
}
}
final public void first_term(RecoverySet g) throws ParseException {
trace_call("first_term");
try {
element(g);
top_priority_operators(g);
} finally {
trace_return("first_term");
}
}
final public void second_term(RecoverySet g) throws ParseException {
trace_call("second_term");
try {
first_term(g);
medium_priority_operators(g);
} finally {
trace_return("second_term");
}
}
final public void element(RecoverySet g) throws ParseException {
trace_call("element");
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IDENTIFIER:{
jj_consume_token(IDENTIFIER);
adicionar_regra("#24");
index();
adicionar_regra("#51");
break;
}
case NUM:{
jj_consume_token(NUM);
adicionar_regra("#26");
break;
}
case NUMBER_REAL:{
jj_consume_token(NUMBER_REAL);
adicionar_regra("#27");
break;
}
case STRING_LITERAL:{
jj_consume_token(STRING_LITERAL);
adicionar_regra("#28");
break;
}
case TRUE:{
jj_consume_token(TRUE);
adicionar_regra("#52");
break;
}
case UNTRUE:{
jj_consume_token(UNTRUE);
adicionar_regra("#53");
break;
}
case OPEN_PARENTHESIS:{
jj_consume_token(OPEN_PARENTHESIS);
expression(g);
jj_consume_token(CLOSE_PARENTHESIS);
break;
}
case LOGICAL_NOT:{
jj_consume_token(LOGICAL_NOT);
jj_consume_token(OPEN_PARENTHESIS);
expression(g);
jj_consume_token(CLOSE_PARENTHESIS);
adicionar_regra("#54");
break;
}
default:
jj_la1[25] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} finally {
trace_return("element");
}
}
final public void index() throws ParseException {
trace_call("index");
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case OPEN_CURLY_BRACKETS:{
jj_consume_token(OPEN_CURLY_BRACKETS);
jj_consume_token(NUM);
adicionar_regra("#12");
jj_consume_token(CLOSE_CURLY_BRACKETS);
adicionar_regra("#11");
break;
}
default:
jj_la1[26] = jj_gen;
;
}
} finally {
trace_return("index");
}
}
final public void top_priority_operators(RecoverySet g) throws ParseException {
trace_call("top_priority_operators");
try {
label_8:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case POWER:{
;
break;
}
default:
jj_la1[27] = jj_gen;
break label_8;
}
jj_consume_token(POWER);
element(g);
adicionar_regra("#50");
}
} finally {
trace_return("top_priority_operators");
}
}
final public void medium_priority_operators(RecoverySet g) throws ParseException {
trace_call("medium_priority_operators");
try {
label_9:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case MULTIPLY:
case DIV:
case WHOLE_DIV:
case REST_DIV:
case LOGICAL_AND:{
;
break;
}
default:
jj_la1[28] = jj_gen;
break label_9;
}
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case MULTIPLY:{
jj_consume_token(MULTIPLY);
first_term(g);
adicionar_regra("#45");
break;
}
case DIV:{
jj_consume_token(DIV);
first_term(g);
adicionar_regra("#46");
break;
}
case WHOLE_DIV:{
jj_consume_token(WHOLE_DIV);
first_term(g);
adicionar_regra("#47");
break;
}
case REST_DIV:{
jj_consume_token(REST_DIV);
first_term(g);
adicionar_regra("#48");
break;
}
case LOGICAL_AND:{
jj_consume_token(LOGICAL_AND);
first_term(g);
adicionar_regra("#49");
break;
}
default:
jj_la1[29] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
} finally {
trace_return("medium_priority_operators");
}
}
final public void lesser_priority_operators(RecoverySet g) throws ParseException {
trace_call("lesser_priority_operators");
try {
label_10:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case PLUS:
case MINUS:
case LOGICAL_OR:{
;
break;
}
default:
jj_la1[30] = jj_gen;
break label_10;
}
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case PLUS:{
jj_consume_token(PLUS);
second_term(g);
adicionar_regra("#42");
break;
}
case MINUS:{
jj_consume_token(MINUS);
second_term(g);
adicionar_regra("#43");
break;
}
case LOGICAL_OR:{
jj_consume_token(LOGICAL_OR);
second_term(g);
adicionar_regra("#44");
break;
}
default:
jj_la1[31] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
} finally {
trace_return("lesser_priority_operators");
}
}
final public void repeat(RecoverySet r) throws ParseException {
trace_call("repeat");
try {
RecoverySet g = new RecoverySet(OPEN_BRACKET);
RecoverySet h = new RecoverySet(CLOSE_BRACKET);
try {
jj_consume_token(REPEAT);
jj_consume_token(THIS);
adicionar_regra("#33");
expression(g);
adicionar_regra("#34");
jj_consume_token(OPEN_BRACKET);
list_of_commands(h);
jj_consume_token(CLOSE_BRACKET);
adicionar_regra("#35");
jj_consume_token(DOT);
} catch (ParseException e) {
consumeUntil(r, e, "");
output.add(new ErrorStruct("Erro: Declara\u00e7\u00e3o do comando repeat incorreta. \n", e));
}
} finally {
trace_return("repeat");
}
}
final public void avaliate(RecoverySet r) throws ParseException {
trace_call("avaliate");
try {
RecoverySet g = new RecoverySet(DOT);
try {
jj_consume_token(AVALIATE);
jj_consume_token(THIS);
expression(First.selection_command);
logic_result(g);
adicionar_regra("#29");
} catch (ParseException e) {
consumeUntil(r, e, "");
output.add(new ErrorStruct("Erro: Declara\u00e7\u00e3o do comando avaliate incorreta. \n", e));
}
} finally {
trace_return("avaliate");
}
}
final public void write(RecoverySet g) throws ParseException {
trace_call("write");
try {
try {
jj_consume_token(THIS);
adicionar_regra("#22");
jj_consume_token(OPEN_BRACKET);
write_body();
jj_consume_token(CLOSE_BRACKET);
jj_consume_token(DOT);
} catch (ParseException e) {
consumeUntil(g, e, "list_of_commands");
output.add(new ErrorStruct("Erro: Comando write incorreto.\n", e));
}
} finally {
trace_return("write");
}
}
final public void write_all(RecoverySet g) throws ParseException {
trace_call("write_all");
try {
try {
jj_consume_token(ALL);
jj_consume_token(THIS);
adicionar_regra("#21");
jj_consume_token(OPEN_BRACKET);
write_body();
jj_consume_token(CLOSE_BRACKET);
jj_consume_token(DOT);
} catch (ParseException e) {
consumeUntil(g, e, "");
output.add(new ErrorStruct("Erro: no comando write all.\n", e));
}
} finally {
trace_return("write_all");
}
}
final public void write_body() throws ParseException {
trace_call("write_body");
try {
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case NUM:
case NUMBER_REAL:
case STRING_LITERAL:{
constant_result();
adicionar_regra("#23");
label_11:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA:{
;
break;
}
default:
jj_la1[32] = jj_gen;
break label_11;
}
jj_consume_token(COMMA);
write_body_cont();
}
break;
}
case IDENTIFIER:{
identifiers();
label_12:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COMMA:{
;
break;
}
default:
jj_la1[33] = jj_gen;
break label_12;
}
jj_consume_token(COMMA);
write_body_cont();
}
break;
}
default:
jj_la1[34] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} catch (ParseException e) {
output.add(new ErrorStruct("Erro: Erro no corpo do write.\n", e));
}
} finally {
trace_return("write_body");
}
}
final public void write_body_cont() throws ParseException {
trace_call("write_body_cont");
try {
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case NUM:
case NUMBER_REAL:
case STRING_LITERAL:{
constant_result();
break;
}
case IDENTIFIER:{
identifiers();
break;
}
default:
jj_la1[35] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
adicionar_regra("#23");
} catch (ParseException e) {
output.add(new ErrorStruct("Erro: Erro no corpo do write.\n", e));
}
} finally {
trace_return("write_body_cont");
}
}
final public void designate(RecoverySet r) throws ParseException {
trace_call("designate");
try {
RecoverySet h = new RecoverySet(DOT);
try {
jj_consume_token(DESIGNATE);
jj_consume_token(THIS);
adicionar_regra("#18");
identifiers_list();
jj_consume_token(AS);
expression(h);
adicionar_regra("#19");
jj_consume_token(DOT);
} catch (ParseException e) {
consumeUntil(r, e, "");
output.add(new ErrorStruct("Erro: Erro de atribui\u00e7\u00e3o (designate).\n", e));
}
} finally {
trace_return("designate");
}
}
final public void read(RecoverySet r) throws ParseException {
trace_call("read");
try {
try {
jj_consume_token(READ);
jj_consume_token(THIS);
adicionar_regra("#20");
jj_consume_token(OPEN_BRACKET);
identifiers_list();
jj_consume_token(CLOSE_BRACKET);
jj_consume_token(DOT);
} catch (ParseException e) {
consumeUntil(r, e, "read");
}
} finally {
trace_return("read");
}
}
final public void header(RecoverySet r) throws ParseException {
trace_call("header");
try {
try {
jj_consume_token(DO);
jj_consume_token(THIS);
jj_consume_token(IDENTIFIER);
listaParametros.add(token.image);
adicionar_regra("#1", listaParametros);
listaParametros.remove(token.image);
if(regraDasLinguagem.getError().isEmpty()) {
instrucoes = new Instruction();
for(Instruction inst : regraDasLinguagem.getPilha_de_instrucoes()){
System.out.println(inst.getPonteiro() + " | " + inst.getInstrucao() + " | " + inst.getEndereco());
}
}
jj_consume_token(OPEN_BRACKET);
jj_consume_token(CLOSE_BRACKET);
} catch (ParseException e) {
consumeUntil(r, e, "header");
output.add(new ErrorStruct("Erro: Cabecalho principal incorreto.\n", e));
}
} finally {
trace_return("header");
}
}
final public void body(RecoverySet r) throws ParseException {
trace_call("body");
try {
RecoverySet g = new RecoverySet(OPEN_BRACKET);
try {
jj_consume_token(BODY);
jj_consume_token(OPEN_BRACKET);
list_of_commands(g);
jj_consume_token(CLOSE_BRACKET);
} catch (ParseException e) {
consumeUntil(r, e, "body");
output.add(new ErrorStruct("Erro: Declarac\u00e3o do corpo incorreto.\n", e));
}
} finally {
trace_return("body");
}
}
final public void desc(RecoverySet r) throws ParseException {
trace_call("desc");
try {
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case DESCRIPTION:{
jj_consume_token(DESCRIPTION);
jj_consume_token(STRING_LITERAL);
break;
}
default:
jj_la1[36] = jj_gen;
;
}
} catch (ParseException e) {
consumeUntil(r, e, "description");
output.add(new ErrorStruct("Erro: Descricao do programa incorreto\n", e));
}
} finally {
trace_return("desc");
}
}
final public void main(RecoverySet r) throws ParseException {
trace_call("main");
try {
RecoverySet h = new RecoverySet(BODY);
RecoverySet g = new RecoverySet(DECLARATION);
RecoverySet i = g.union(h);
RecoverySet l = new RecoverySet(DESCRIPTION);
try {
header(i);
declarations(h);
body(r.union(l));
desc(r);
adicionar_regra("#2");
} catch (ParseException e) {
consumeUntil(r, e, "main");
}
} finally {
trace_return("main");
}
}
final public void begin_program() throws ParseException {
trace_call("begin_program");
try {
RecoverySet r = new RecoverySet(EOF);
try {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case DO:{
main(r);
break;
}
default:
jj_la1[37] = jj_gen;
;
}
jj_consume_token(0);
} catch (ParseException e) {
consumeUntil(r, e, "begin_program");
output.add(new ErrorStruct("Erro: Forma geral do programa incorreto.\n", e));
}
} finally {
trace_return("begin_program");
}
}
final public void adicionar_regra(String regra) throws ParseException {
trace_call("adicionar_regra");
try {
try {
adicionar_regra(regra, null);
} catch (ParseException e) {
output.add(new ErrorStruct("", null));
}
} finally {
trace_return("adicionar_regra");
}
}
final public void adicionar_regra2(String regra, List<String> lista_parametros) throws ParseException {
trace_call("adicionar_regra2");
try {
try {
Empty();
} catch (ParseException e) {
output.add(new ErrorStruct("", null));
}
} finally {
trace_return("adicionar_regra2");
}
}
final public void Empty() throws ParseException {
trace_call("Empty");
try {
} finally {
trace_return("Empty");
}
}
/** Generated Token Manager. */
public LanguageParserTokenManager token_source;
JavaCharStream jj_input_stream;
/** Current token. */
public Token token;
/** Next token. */
public Token jj_nt;
private int jj_ntk;
private int jj_gen;
final private int[] jj_la1 = new int[38];
static private int[] jj_la1_0;
static private int[] jj_la1_1;
static private int[] jj_la1_2;
static {
jj_la1_init_0();
jj_la1_init_1();
jj_la1_init_2();
}
private static void jj_la1_init_0() {
jj_la1_0 = new int[] {0x0,0x0,0x0,0x20000000,0x0,0x80000700,0x700,0x0,0x0,0x40000,0x0,0x0,0x40000,0x300000,0x0,0x1800,0x1000,0x800,0x40100000,0x20000000,0x2004000,0x15c00000,0x15c00000,0x0,0x0,0x1800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x2000,};
}
private static void jj_la1_init_1() {
jj_la1_1 = new int[] {0x64000000,0x200000,0x4000000,0x0,0x200000,0x2000000,0x2000000,0x4000000,0x4000000,0x0,0x4000000,0x4000000,0x0,0x0,0x60000000,0x0,0x100000,0x100000,0x0,0x0,0x0,0x0,0x0,0x3e80,0x3e80,0x65010000,0x40000,0x10,0x40006c,0x40006c,0x800003,0x800003,0x200000,0x200000,0x64000000,0x64000000,0x0,0x0,};
}
private static void jj_la1_init_2() {
jj_la1_2 = new int[] {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,};
}
{
enable_tracing();
}
/** Constructor with InputStream. */
public LanguageParser(java.io.InputStream stream) {
this(stream, null);
}
/** Constructor with InputStream and supplied encoding */
public LanguageParser(java.io.InputStream stream, String encoding) {
try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
token_source = new LanguageParserTokenManager(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 38; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
public void ReInit(java.io.InputStream stream) {
ReInit(stream, null);
}
/** Reinitialise. */
public void ReInit(java.io.InputStream stream, String encoding) {
try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
token_source.ReInit(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 38; i++) jj_la1[i] = -1;
}
/** Constructor. */
public LanguageParser(java.io.Reader stream) {
jj_input_stream = new JavaCharStream(stream, 1, 1);
token_source = new LanguageParserTokenManager(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 38; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
public void ReInit(java.io.Reader stream) {
if (jj_input_stream == null) {
jj_input_stream = new JavaCharStream(stream, 1, 1);
} else {
jj_input_stream.ReInit(stream, 1, 1);
}
if (token_source == null) {
token_source = new LanguageParserTokenManager(jj_input_stream);
}
token_source.ReInit(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 38; i++) jj_la1[i] = -1;
}
/** Constructor with generated Token Manager. */
public LanguageParser(LanguageParserTokenManager tm) {
token_source = tm;
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 38; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
public void ReInit(LanguageParserTokenManager tm) {
token_source = tm;
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 38; i++) jj_la1[i] = -1;
}
private Token jj_consume_token(int kind) throws ParseException {
Token oldToken;
if ((oldToken = token).next != null) token = token.next;
else token = token.next = token_source.getNextToken();
jj_ntk = -1;
if (token.kind == kind) {
jj_gen++;
trace_token(token, "");
return token;
}
token = oldToken;
jj_kind = kind;
throw generateParseException();
}
/** Get the next Token. */
final public Token getNextToken() {
if (token.next != null) token = token.next;
else token = token.next = token_source.getNextToken();
jj_ntk = -1;
jj_gen++;
trace_token(token, " (in getNextToken)");
return token;
}
/** Get the specific Token. */
final public Token getToken(int index) {
Token t = token;
for (int i = 0; i < index; i++) {
if (t.next != null) t = t.next;
else t = t.next = token_source.getNextToken();
}
return t;
}
private int jj_ntk_f() {
if ((jj_nt=token.next) == null)
return (jj_ntk = (token.next=token_source.getNextToken()).kind);
else
return (jj_ntk = jj_nt.kind);
}
private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
private int[] jj_expentry;
private int jj_kind = -1;
/** Generate ParseException. */
public ParseException generateParseException() {
jj_expentries.clear();
boolean[] la1tokens = new boolean[67];
if (jj_kind >= 0) {
la1tokens[jj_kind] = true;
jj_kind = -1;
}
for (int i = 0; i < 38; i++) {
if (jj_la1[i] == jj_gen) {
for (int j = 0; j < 32; j++) {
if ((jj_la1_0[i] & (1<<j)) != 0) {
la1tokens[j] = true;
}
if ((jj_la1_1[i] & (1<<j)) != 0) {
la1tokens[32+j] = true;
}
if ((jj_la1_2[i] & (1<<j)) != 0) {
la1tokens[64+j] = true;
}
}
}
}
for (int i = 0; i < 67; i++) {
if (la1tokens[i]) {
jj_expentry = new int[1];
jj_expentry[0] = i;
jj_expentries.add(jj_expentry);
}
}
int[][] exptokseq = new int[jj_expentries.size()][];
for (int i = 0; i < jj_expentries.size(); i++) {
exptokseq[i] = jj_expentries.get(i);
}
return new ParseException(token, exptokseq, tokenImage);
}
private boolean trace_enabled;
/** Trace enabled. */
final public boolean trace_enabled() {
return trace_enabled;
}
private int trace_indent = 0;
/** Enable tracing. */
final public void enable_tracing() {
trace_enabled = true;
}
/** Disable tracing. */
final public void disable_tracing() {
trace_enabled = false;
}
protected void trace_call(String s) {
if (trace_enabled) {
for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
System.out.println("Call: " + s);
}
trace_indent = trace_indent + 2;
}
protected void trace_return(String s) {
trace_indent = trace_indent - 2;
if (trace_enabled) {
for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
System.out.println("Return: " + s);
}
}
protected void trace_token(Token t, String where) {
if (trace_enabled) {
for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
System.out.print("Consumed token: <" + tokenImage[t.kind]);
if (t.kind != 0 && !tokenImage[t.kind].equals("\"" + t.image + "\"")) {
System.out.print(": \"" + TokenMgrError.addEscapes(t.image) + "\"");
}
System.out.println(" at line " + t.beginLine + " column " + t.beginColumn + ">" + where);
}
}
protected void trace_scan(Token t1, int t2) {
if (trace_enabled) {
for (int i = 0; i < trace_indent; i++) { System.out.print(" "); }
System.out.print("Visited token: <" + tokenImage[t1.kind]);
if (t1.kind != 0 && !tokenImage[t1.kind].equals("\"" + t1.image + "\"")) {
System.out.print(": \"" + TokenMgrError.addEscapes(t1.image) + "\"");
}
System.out.println(" at line " + t1.beginLine + " column " + t1.beginColumn + ">; Expected token: <" + tokenImage[t2] + ">");
}
}
}
options {
IGNORE_CASE = true;
JAVA_UNICODE_ESCAPE = true;
STATIC = false;
DEBUG_PARSER = true;
LOOKAHEAD = 1;
DEBUG_LOOKAHEAD = true;
}
PARSER_BEGIN(LanguageParser)
package compiler.parser;
import javax.swing.text.html.parser.Parser;
import java.util.List;
import java.util.ArrayList;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.lang.StringBuilder;
import java.lang.StringBuilder;
public class LanguageParser {
int contParseError = 0;
boolean debugRecovery = true;
final static List<ErrorStruct> output = new ArrayList<ErrorStruct>();
boolean eof;
static List<String> listaComandos = new ArrayList<String>();
static List<String> listaParametros = new ArrayList<String>();
static LanguageRules regraDasLinguagem = new LanguageRules();
static VirtualMachine maquina;
static Instruction instrucoes;
public LanguageParser LanguageParser(String code){
this.checkSyntax(code);
return this;
}
final public void adicionar_regra(String regra, List<String> lista_parametros_dentro_funcao) throws ParseException {
System.out.println("HERHEHRHE");
switch(regra){
case "#1":
regraDasLinguagem.regra1(lista_parametros_dentro_funcao.get(0));
for(Instruction instrucao: regraDasLinguagem.getPilha_de_instrucoes()){
System.out.println(instrucao.getPonteiro() + " | " + instrucao.getInstrucao() + " | " + instrucao.getEndereco());
}
System.out.println("\n\n");
for(SymbolTable tabelaSimbolo: regraDasLinguagem.getPilha_de_simbolos()){
System.out.println(tabelaSimbolo.getIdentificador() + " | " + tabelaSimbolo.getCategoria() + " | " +
tabelaSimbolo.getAtributo1() + " | " + tabelaSimbolo.getAtributo2());
}
break;
case "#2":
regraDasLinguagem.regra2();
break;
case "#3":
regraDasLinguagem.regra3();
break;
case "#4":
regraDasLinguagem.regra4(lista_parametros_dentro_funcao.get(0));
break;
case "#5":
regraDasLinguagem.regra5();
break;
case "#6":
regraDasLinguagem.regra6();
break;
case "#7":
regraDasLinguagem.regra7();
break;
case "#8":
regraDasLinguagem.regra8();
break;
case "#9":
regraDasLinguagem.regra9();
break;
case "#10":
regraDasLinguagem.regra10(lista_parametros_dentro_funcao.get(0));
break;
case "#11":
regraDasLinguagem.regra11(lista_parametros_dentro_funcao.get(0));
break;
case "#12":
regraDasLinguagem.regra12();
break;
case "#13":
regraDasLinguagem.regra13(Integer.parseInt(lista_parametros_dentro_funcao.get(0)));
break;
case "#14":
regraDasLinguagem.regra14();
break;
case "#15":
regraDasLinguagem.regra15();
break;
case "#16":
regraDasLinguagem.regra16();
break;
case "#17":
regraDasLinguagem.regra17();
break;
case "#18":
regraDasLinguagem.regra18(lista_parametros_dentro_funcao.get(0));
break;
case "#19":
regraDasLinguagem.regra19();
break;
case "#20":
regraDasLinguagem.regra20(Integer.parseInt(lista_parametros_dentro_funcao.get(0)));
break;
case "#21":
regraDasLinguagem.regra21(Float.parseFloat(lista_parametros_dentro_funcao.get(0)));
break;
case "#22":
regraDasLinguagem.regra22(lista_parametros_dentro_funcao.get(0));
break;
case "#23":
regraDasLinguagem.regra23();
break;
case "#24":
regraDasLinguagem.regra24();
break;
case "#25":
regraDasLinguagem.regra25();
break;
case "#26":
regraDasLinguagem.regra26();
break;
case "#27":
regraDasLinguagem.regra27();
break;
case "#28":
regraDasLinguagem.regra28();
break;
case "#29":
regraDasLinguagem.regra29();
break;
case "#30":
regraDasLinguagem.regra30();
break;
case "#31":
regraDasLinguagem.regra31();
break;
case "#32":
regraDasLinguagem.regra32();
break;
case "#33":
regraDasLinguagem.regra33();
break;
case "#34":
regraDasLinguagem.regra34();
break;
case "#35":
regraDasLinguagem.regra35();
break;
case "#36":
regraDasLinguagem.regra36();
break;
case "#37":
regraDasLinguagem.regra37();
break;
case "#38":
regraDasLinguagem.regra38();
break;
case "#39":
regraDasLinguagem.regra39();
break;
case "#40":
regraDasLinguagem.regra40();
break;
case "#41":
regraDasLinguagem.regra41();
break;
case "#42":
regraDasLinguagem.regra42();
break;
case "#43":
regraDasLinguagem.regra43();
break;
case "#44":
regraDasLinguagem.regra44();
break;
case "#45":
regraDasLinguagem.regra45();
break;
case "#46":
regraDasLinguagem.regra46();
break;
case "#47":
regraDasLinguagem.regra47();
break;
case "#48":
regraDasLinguagem.regra48();
break;
case "#49":
regraDasLinguagem.regra49();
break;
default :
break;
}
}
public static List<Token> getTokens(String stream){
InputStream target = new ByteArrayInputStream(stream.getBytes());
LanguageParser parser = new LanguageParser(target);
return tokenize(parser);
}
public static ArrayList<ErrorStruct> checkSyntax(String stream) {
InputStream target = new ByteArrayInputStream(stream.getBytes());
LanguageParser parser = new LanguageParser(target);
try {
parser.begin_program();
}
catch (ParseException e){
output.add(new ErrorStruct("Error parsing the program.\n", e));
}
ArrayList tmp = new ArrayList<ErrorStruct>(output);
output.clear();
return tmp;
}
public static LanguageParser create(String stream){
InputStream target = new ByteArrayInputStream(stream.getBytes());
LanguageParser parser = new LanguageParser(target);
return parser;
}
public static void main(String args[]) throws TokenMgrError, ParseException {
LanguageParser parser = null;
if (args.length == 0) {
parser = new LanguageParser(System.in);
}
else if (args.length == 1) {
try {
parser = new LanguageParser(new java.io.FileInputStream(args[0]));
}
catch (java.io.FileNotFoundException e) {
System.out.println("LanguageParser: file " + args[0] + " was not found.");
return;
}
}
//for (Token token: tokenize(parser)){
// String name = LanguageParserConstants.tokenImage[token.kind];
// System.out.println("Line " + token.beginLine + " | Column " + token.beginColumn + " | " + token + "\n");
//}
}
public static List<Token> tokenize(LanguageParser parser){
List<Token> tokens = new ArrayList<Token>();
Token token = parser.getNextToken();
while (token.kind != LanguageParserConstants.EOF){
tokens.add(token);
token = parser.getNextToken();
}
if (!TokenHandler.isClosed()){
tokens.add(TokenHandler.createToken());
}
return tokens;
}
static public String im(int x){
String s = tokenImage[x];
int k = s.lastIndexOf("\"");
try {
s = s.substring(1, k);
}
catch (StringIndexOutOfBoundsException e){}
return s;
}
public void consumeUntil(RecoverySet g, ParseException e, String met) throws ParseException {
Token tok;
if (g == null){
throw e;
}
tok = getToken(1); // Current token
while (!eof){
/* found a token in set */
if (g.contains(tok.kind)) {
break;
}
getNextToken();
tok = getToken(1);
if (tok.kind == EOF && !g.contains(EOF)){
eof = true;
}
}
contParseError++;
}
}
PARSER_END(LanguageParser)
SKIP: {
" "
| "\n"
| "\t"
| < "#" (~["\n"])* >
| < "/*"> {TokenHandler.writeInvalidToOutput(image.toString(), input_stream.getEndLine(), input_stream.getBeginColumn(), jjmatchedKind);}: BLOCK_COMMENT_STATE
}
<BLOCK_COMMENT_STATE> SKIP: {
<"/*"> {TokenHandler.setClosed(true);}: DEFAULT
| <~[]>
}
/* Keywords */
TOKEN: {
<INTEGER: "integer">
| <REAL: "real">
| <STRING: "string">
| <TRUE: "true">
| <UNTRUE: "untrue">
| <DO: "do">
| <THIS: "this">
| <DESCRIPTION: "description">
| <BODY: "body">
| <IS: "is">
| <AS: "as">
| <AND: "and">
| <CONSTANT: "constant">
| <VARIABLE: "variable">
| <DESIGNATE: "designate">
| <READ: "read">
| <WRITE: "write">
| <ALL: "all">
| <AVALIATE: "avaliate">
| <RESULT: "result">
| <REPEAT: "repeat">
| <DECLARATION: "declaration">
| <TYPE: "type">
| <ENUM: "enum">
}
/* Operators, relations, etc*/
TOKEN: {
<PLUS : "+">
| <MINUS : "-">
| <MULTIPLY : "*">
| <DIV : "/">
| <POWER : "**">
| <WHOLE_DIV : "%">
| <REST_DIV: "%%">
| <EQUAL_TO: "==">
| <ASSIGN: "=">
| <DIFF_THAN: "!=">
| <LESS_THAN: "<<">
| <GREATER_THAN: ">>">
| <LESS_THAN_OR_EQ_TO: "<<=">
| <GREATER_THAN_OR_EQ_TO: ">>=">
| <OPEN_BRACKET: "[">
| <CLOSE_BRACKET: "]">
| <OPEN_PARENTHESIS: "(">
| <CLOSE_PARENTHESIS: ")">
| <OPEN_CURLY_BRACKETS: "{">
| <CLOSE_CURLY_BRACKETS: "}">
| <DOT: ".">
| <COMMA: ",">
}
/* Logical Operators */
TOKEN: {
<LOGICAL_AND : "&" >
| <LOGICAL_OR : "|">
| <LOGICAL_NOT: "!">
| <LOGIC: "logic">
}
/* Identifiers */
TOKEN: {
<IDENTIFIER: (<LETTER>(<DIGITS>)?(<LETTER>|(""))*)+(("")|<LETTER>)*>
| <#LETTER: ["a"-"z","A"-"Z"]>
| <#DIGITS: (["0"-"9"])>
}
/* Numbers */
TOKEN: {
<NUM : (<MINUS>)?(<DIGIT>)+>
| <NUMBER_REAL : ((<MINUS>)? (<DIGIT>)+ <DOT> (<DIGIT>)+)>
| <#DIGIT : ["0" - "9"]>
}
TOKEN: {
<STRING_LITERAL: ("\"" (~["\"","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "\"")
| ("\'" (~["\'","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "\'")>
}
/* Catch all for undefined tokens */
TOKEN : {
<OTHER: ~[]> |
<INVALID_IDENTIFIER:
<LETTER>(<LETTER>|<DIGITS>|(""))*<DIGITS>(<DIGITS>)+(<LETTER>|(""))* |
<LETTER>(<LETTER>|<DIGITS>|("_"))*(<DIGITS>)+ |
<LETTER>(<LETTER>|<DIGITS>)((""))+<DIGITS>(<LETTER>|<DIGITS>|("")) |
(<DIGITS>)+(<LETTER>|<DIGITS>|("_"))* |
("")(<LETTER>|<DIGITS>|(""))*>
}
void enum_values(): {} {
(constant_result() | <IDENTIFIER>) adicionar_regra("#4")
}
void inner_enum_declaration(RecoverySet r) : {} {
try {
<IDENTIFIER> adicionar_regra("#3") <IS> enum_values() inner_enum_decla_cont() <DOT>
}
catch (ParseException e){
consumeUntil(r, e, "Error: Invalid enum declaration syntax.");
output.add(new ErrorStruct("Erro: declaracao de enum interna incorreta.\n", e));
}
}
void inner_enum_decla_cont() : {} {
(<COMMA> enum_values() inner_enum_decla_cont())?
}
void enum_declaration(RecoverySet r) : {} {
try {
<TYPE> <OPEN_BRACKET>
(inner_enum_declaration(r))+
<CLOSE_BRACKET>
(<DECLARATION> declaration_constants_and_variables(r))?
}
catch (ParseException e){
consumeUntil(r, e, "Error: Invalid enum declaration syntax.");
output.add(new ErrorStruct("Erro: declaracao de enum incorreta.\n", e));
}
}
void identifiers() : {} {
<IDENTIFIER> adicionar_regra("#10") index() adicionar_regra("#25")
}
void identifiers_list() : {} {
try {
identifiers() (<COMMA> identifiers())*
}
catch (ParseException e){
output.add(new ErrorStruct("Erro: Lista de identificadores incorreto.\n", e));
}
}
void type_declaration() : {} {
<INTEGER> adicionar_regra("#13") | <REAL> adicionar_regra("#14") | <STRING> adicionar_regra("#15") | <LOGIC> adicionar_regra("#16") | <ENUM> adicionar_regra("#17")
}
void variable_declaration() : {} {
identifiers_list() <IS> type_declaration() adicionar_regra("#6") <DOT>
}
void type_constant() : {} {
<INTEGER> | <REAL> | <STRING> | <LOGIC>
}
void end_constant() : {} {
<AS> <CONSTANT> adicionar_regra("#5") (constant_declaration())+
}
void start_variable() : {} {
<VARIABLE> adicionar_regra("#8") (variable_declaration())+ (end_constant())?
}
void constant_declaration() : {} {
identifiers_list() <IS> type_constant() adicionar_regra("#6") <ASSIGN> constant_result() adicionar_regra("#7") <DOT>
}
void end_variable() : {} {
<AS> <VARIABLE> adicionar_regra("#8") (variable_declaration())+
}
void start_constant() : {} {
<CONSTANT> adicionar_regra("#5") (constant_declaration())+ (end_variable())?
}
void start_declaration(RecoverySet r) : {} {
try{
start_variable() | start_constant()
}
catch (ParseException e){
consumeUntil(r, e, "Error: Invalid declaration body.\n");
output.add(new ErrorStruct("Erro: Declaracão de variavel/constante errado.\n", e));
}
}
void inner_declaration(RecoverySet r) : {} {
try {
<AS> adicionar_regra("#5") start_declaration(r)
}
catch (ParseException e){
consumeUntil(r, e, "Error: Invalid declaration body.\n");
output.add(new ErrorStruct("Error: Bad inner declaration of as.\n", e));
}
}
void declaration_constants_and_variables(RecoverySet r) : {} {
try{
<CONSTANT> <AND> <VARIABLE> <OPEN_BRACKET> inner_declaration(r) <CLOSE_BRACKET>
}
catch (ParseException e){
consumeUntil(r, e, "declaration_constants_and_variables");
output.add(new ErrorStruct("Error: Forma geral de declaracão de constante e variaval incorreta.\n", e));
}
}
void constant_result() : {} {
<STRING_LITERAL> adicionar_regra("#28") | <NUM> adicionar_regra("#26") | <NUMBER_REAL> adicionar_regra("#27")
}
void logic_result(RecoverySet r ) : {RecoverySet g = new RecoverySet(CLOSE_BRACKET);} {
try {
<TRUE> <RESULT> adicionar_regra("#30") <OPEN_BRACKET> list_of_commands(g) <CLOSE_BRACKET> true_result_cont() | <UNTRUE> <RESULT> adicionar_regra("#31") <OPEN_BRACKET> list_of_commands(g) <CLOSE_BRACKET> untrue_result_cont()
}
catch (ParseException e){
consumeUntil(r, e, "");
output.add(new ErrorStruct("Erro: Verificação de resultado logico incorreto.\n", e));
}
}
void true_result_cont() : {RecoverySet g = new RecoverySet(CLOSE_BRACKET);} {
try {
(<UNTRUE> <RESULT> adicionar_regra("#32") <OPEN_BRACKET> list_of_commands(g) <CLOSE_BRACKET> <DOT>) | <DOT>
}
catch (ParseException e){
consumeUntil(g, e, "list_of_commands");
output.add(new ErrorStruct("Erro: Clausula de teste incorreta.\n", e));
}
}
void untrue_result_cont() : {RecoverySet g = new RecoverySet(CLOSE_BRACKET);} {
try {
(<TRUE> <RESULT> adicionar_regra("#32") <OPEN_BRACKET> list_of_commands(g) <CLOSE_BRACKET> <DOT>) | <DOT>
}
catch (ParseException e){
consumeUntil(g, e, "");
output.add(new ErrorStruct("Erro: Clausula de teste incorreta.\n", e));
}
}
void declarations(RecoverySet r) : {} {
try {
(<DECLARATION> (enum_declaration(r) | declaration_constants_and_variables(r)))?
}
catch (ParseException e) {
consumeUntil(r, e, "declarations");
output.add(new ErrorStruct("Erro de declaração de enum/variable\n", e));
}
}
void list_of_commands(RecoverySet r) : {RecoverySet g = First.list_of_commands ;} {
try {
(repeat(g) | avaliate(g) | (<WRITE> (write(g) | write_all(g))) | designate(g) | read(g))+
}
catch (ParseException e){
consumeUntil(r, e, "list_of_commands");
output.add(new ErrorStruct("Erro: Declaração de comando incorreta.\n", e));
}
}
void expression(RecoverySet g) : {} {
try {
arithmetic_or_logic_expression(g) expression_cont(g)
}
catch (ParseException e){
consumeUntil(g, e, "list_of_commands");
output.add(new ErrorStruct("Erro: Expressão incorreta.\n", e));
}
}
void arithmetic_or_logic_expression(RecoverySet g) : {} {
second_term(g) lesser_priority_operators(g)
}
void expression_cont(RecoverySet g) : {} {
((<EQUAL_TO> arithmetic_or_logic_expression(g)) adicionar_regra("#36") | (<DIFF_THAN> arithmetic_or_logic_expression(g)) adicionar_regra("#37") | (<LESS_THAN> arithmetic_or_logic_expression(g)) adicionar_regra("#38") | (<GREATER_THAN> arithmetic_or_logic_expression(g)) adicionar_regra("#39")
| (<LESS_THAN_OR_EQ_TO> arithmetic_or_logic_expression(g)) adicionar_regra("#40") | (<GREATER_THAN_OR_EQ_TO> arithmetic_or_logic_expression(g)) adicionar_regra("#41"))?
}
void first_term(RecoverySet g) : {} {
element(g) top_priority_operators(g)
}
void second_term(RecoverySet g) : {} {
first_term(g) medium_priority_operators(g)
}
void element(RecoverySet g) : {} {
(<IDENTIFIER> adicionar_regra("#24") index() adicionar_regra("#51"))
| <NUM> adicionar_regra("#26") | <NUMBER_REAL> adicionar_regra("#27") | <STRING_LITERAL> adicionar_regra("#28")
| <TRUE> adicionar_regra("#52")| <UNTRUE> adicionar_regra("#53")| (<OPEN_PARENTHESIS> expression(g) <CLOSE_PARENTHESIS>)
| (<LOGICAL_NOT> <OPEN_PARENTHESIS> expression(g) <CLOSE_PARENTHESIS> adicionar_regra("#54"))
}
void index() : {} {
(<OPEN_CURLY_BRACKETS> <NUM> adicionar_regra("#12") <CLOSE_CURLY_BRACKETS> adicionar_regra("#11"))?
}
void top_priority_operators(RecoverySet g) : {} {
(<POWER> element(g) adicionar_regra("#50"))*
}
void medium_priority_operators(RecoverySet g) : {} {
((<MULTIPLY> first_term(g)) adicionar_regra("#45") | (<DIV> first_term(g)) adicionar_regra("#46") | (<WHOLE_DIV> first_term(g)) adicionar_regra("#47") | (<REST_DIV> first_term(g)) adicionar_regra("#48") | (<LOGICAL_AND> first_term(g)) adicionar_regra("#49"))*
}
void lesser_priority_operators(RecoverySet g) : {} {
((<PLUS> second_term(g)) adicionar_regra("#42")| (<MINUS> second_term(g)) adicionar_regra("#43") | (<LOGICAL_OR> second_term(g)) adicionar_regra("#44"))*
}
void repeat(RecoverySet r) : {
RecoverySet g = new RecoverySet(OPEN_BRACKET);
RecoverySet h = new RecoverySet(CLOSE_BRACKET);
} {
try {
<REPEAT> <THIS> adicionar_regra("#33") expression(g) adicionar_regra("#34") <OPEN_BRACKET>
list_of_commands(h)
<CLOSE_BRACKET> adicionar_regra("#35") <DOT>
}
catch (ParseException e){
consumeUntil(r, e, "");
output.add(new ErrorStruct("Erro: Declaração do comando repeat incorreta. \n", e));
}
}
void avaliate(RecoverySet r) : {RecoverySet g = new RecoverySet(DOT);} {
try {
<AVALIATE> <THIS> expression(First.selection_command)
logic_result(g) adicionar_regra("#29")
}
catch (ParseException e){
consumeUntil(r, e, "");
output.add(new ErrorStruct("Erro: Declaração do comando avaliate incorreta. \n", e));
}
}
void write(RecoverySet g) : {} {
try {
<THIS> adicionar_regra("#22") <OPEN_BRACKET> write_body() <CLOSE_BRACKET> <DOT>
}
catch (ParseException e){
consumeUntil(g, e, "list_of_commands");
output.add(new ErrorStruct("Erro: Comando write incorreto.\n", e));
}
}
void write_all(RecoverySet g) : {} {
try {
<ALL> <THIS> adicionar_regra("#21") <OPEN_BRACKET> write_body() <CLOSE_BRACKET> <DOT>
}
catch (ParseException e){
consumeUntil(g, e, "");
output.add(new ErrorStruct("Erro: no comando write all.\n", e));
}
}
void write_body() : {} {
try {
(constant_result() adicionar_regra("#23") (<COMMA> write_body_cont())* | identifiers() (<COMMA> write_body_cont())*)
}
catch (ParseException e){
output.add(new ErrorStruct("Erro: Erro no corpo do write.\n", e));
}
}
void write_body_cont() : {} {
try {
(constant_result() | identifiers()) adicionar_regra("#23")
}
catch (ParseException e){
output.add(new ErrorStruct("Erro: Erro no corpo do write.\n", e));
}
}
void designate(RecoverySet r) : {RecoverySet h = new RecoverySet(DOT);} {
try {
<DESIGNATE> <THIS> adicionar_regra("#18") identifiers_list() <AS> expression(h) adicionar_regra("#19") <DOT>
}
catch (ParseException e){
consumeUntil(r, e, "");
output.add(new ErrorStruct("Erro: Erro de atribuição (designate).\n", e));
}
}
void read(RecoverySet r) : {} {
try {
<READ> <THIS> adicionar_regra("#20") <OPEN_BRACKET> identifiers_list() <CLOSE_BRACKET> <DOT>
}
catch (ParseException e){
consumeUntil(r, e, "read");
}
}
void header(RecoverySet r) : {} {
try {
<DO> <THIS> <IDENTIFIER> adicionar_regra("#1") <OPEN_BRACKET> <CLOSE_BRACKET>
}
catch (ParseException e){
consumeUntil(r, e, "header");
output.add(new ErrorStruct("Erro: Cabecalho principal incorreto.\n", e));
}
}
void body(RecoverySet r) : {RecoverySet g = new RecoverySet(OPEN_BRACKET);} {
try {
<BODY> <OPEN_BRACKET>
list_of_commands(g)
<CLOSE_BRACKET>
}
catch (ParseException e){
consumeUntil(r, e, "body");
output.add(new ErrorStruct("Erro: Declaracão do corpo incorreto.\n", e));
}
}
void desc(RecoverySet r) : {} {
try {
(<DESCRIPTION> <STRING_LITERAL>)?
}
catch (ParseException e){
consumeUntil(r, e, "description");
output.add(new ErrorStruct("Erro: Descricao do programa incorreto\n", e));
}
}
void main(RecoverySet r) : {
RecoverySet h = new RecoverySet(BODY);
RecoverySet g = new RecoverySet(DECLARATION);
RecoverySet i = g.union(h);
RecoverySet l = new RecoverySet(DESCRIPTION);
} {
try {
header(i)
declarations(h)
body(r.union(l))
desc(r) adicionar_regra("#2")
}
catch (ParseException e){
consumeUntil(r, e, "main");
}
}
void begin_program() : {RecoverySet r = new RecoverySet(EOF);} {
try {
[ main(r) ] <EOF>
}
catch (ParseException e){
consumeUntil(r, e, "begin_program");
output.add(new ErrorStruct("Erro: Forma geral do programa incorreto.\n", e));
}
}
void adicionar_regra(String regra) : {} {
try {
adicionar_regra2(regra, null)
} catch (ParseException e) {
output.add(new ErrorStruct("", null));
}
}
void adicionar_regra2(String regra, List<String> lista_parametros) : {} {
try {
Empty()
} catch (ParseException e) {
output.add(new ErrorStruct("", null));
}
}
void Empty():{}
{
{}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment