Browse Source

Merge branch 'repita_para' of LInE/ivprog into master

Lucas de Souza 4 years ago
parent
commit
34f5d7d3fc

+ 24 - 2
css/ivprog-visual-1.0.css

@@ -160,7 +160,7 @@ body {
 .expression_operand_1, .expression_operand_2, .operator, .div_comment_text, .value_rendered, .parameters_function_called, .parameters_function_called div, .expression_elements,
 .expression_element, .var_rendered, .menu_add_item, .component_element, .component_element, .conditional_expression, .variable_attribution, .attribution_expression, .var_value_expression,
 .incrementation_field, .incrementation_variable, .first_operand, .operator, .second_operand, .variable_to_switch, .variable_case, .button_remove_case, .editing_name_var, .parameter_div_edit,
-.all_elements_write, .container_var_element_control, .inline_add_command, .restart_expression, .div_parent_handler, .div_drag_writer, .single_element_expression, .ghost_parenthesis {
+.all_elements_write, .container_var_element_control, .inline_add_command, .restart_expression, .div_parent_handler, .div_drag_writer, .single_element_expression, .ghost_parenthesis, .pass_button {
 	display: inline;
 }
 
@@ -295,6 +295,7 @@ div.buttons_manage_columns {
 }
 .ui.repeatNtimes .separator_character {
 	margin-right: 10px;
+	margin-left: 15px;
 }
 .ui.repeatNtimes, .ui.whiletrue {
     min-height: 50px;
@@ -565,7 +566,8 @@ div.function_name_div_updated:active,
 .incrementation_field .first_operand:not(:empty),
 .incrementation_field .operator:not(:empty),
 .incrementation_field .second_operand:not(:empty),
-.single_element_expression, .ghost_parenthesis {
+.single_element_expression, .ghost_parenthesis,
+.ui.repeatNtimes .conditional_expression {
 	background: #e8e8e8;
 	border-radius: 5px;
 	min-width: 40px;
@@ -1054,4 +1056,24 @@ div.ui.checkbox.transition.visible {
 
 .settings_topic .content_segment_settings {
 	margin-left: 40px;
+}
+
+.ui.repeatNtimes .span_command_spec {
+	margin-right: 10px;
+}
+
+.ui.repeatNtimes .ui.attribution_expression {
+	margin-right: -10px;
+}
+
+.ui.repeatNtimes .ui.var_value_expression.div_expression_st {
+	margin-left: -10px;
+}
+
+.pass_button {
+	margin-left: 10px;
+}
+
+.pass_button button {
+	padding-bottom: 2px;
 }

+ 28 - 4
grammar/en/ivprog.g4

@@ -14,7 +14,7 @@ RK_VOID
   ;
 
 RK_BOOLEAN
-  : 'boolean'
+  : 'bool'
   ;
 
 RK_STRING
@@ -22,11 +22,11 @@ RK_STRING
   ;
 
 RK_INTEGER
-  : 'integer'
+  : 'int'
   ;
 
 RK_CHARACTER
-  : 'character'
+  : 'char'
   ;    
 
 RK_SWITCH
@@ -57,18 +57,42 @@ RK_FOR
   : 'for'
   ;
 
+RK_FOR_ALT
+  : 'repeat_for'
+  ;
+
+RK_FOR_FROM
+  : 'from'
+  ;
+
+RK_FOR_TO
+  : 'to'
+  ;
+
+RK_FOR_PASS
+  : 'pass'
+  ;
+
 RK_BREAK
   : 'break'
   ;
 
 RK_DO
-  : 'do'
+  : 'repeat'
+  ;
+
+RK_DO_UNTIL
+  : 'until'
   ;
 
 RK_WHILE
   : 'while'
   ;
 
+RK_WHILE_ALT
+  : 'repeat_while'
+  ;
+
 RK_IF
   : 'if'
   ;

+ 4 - 4
grammar/en/langFunctions.js

@@ -7,10 +7,10 @@ export default {
   $numElements: "total_of_elements",
   $matrixLines: "total_of_lines",
   $matrixColumns: "total_of_columns",
-  $substring: "subcadeia",
-  $length: "comprimento",
-  $uppercase: "caixa_alta",
-  $lowercase: "caixa_baixa",
+  $substring: "substring",
+  $length: "length",
+  $uppercase: "uppercase",
+  $lowercase: "lowercase",
   $charAt: "char_at",
   $isReal: "is_real",
   $isInt: "is_integer",

+ 3 - 3
grammar/en/langLibs.js

@@ -3,8 +3,8 @@
  */
 export default {
   $mathLib: "Mathematic",
-  $ioLib: "ES",
-  $strLib: "Texto",
-  $arrayLib: "Arranjo",
+  $ioLib: "IO",
+  $strLib: "Text",
+  $arrayLib: "Array",
   $langLib: "Conversion"
 }

+ 26 - 2
grammar/pt/ivprog.g4

@@ -50,25 +50,49 @@ RK_FUNCTION
   ;
 
 RK_RETURN
-  : 'retorne'
+  : 'devolva'
   ;  
 
 RK_FOR
   : 'para'
   ;
 
+RK_FOR_ALT
+  : 'repita_para'
+  ;
+
+RK_FOR_FROM
+  : 'de'
+  ;
+
+RK_FOR_TO
+  : 'ate'
+  ;
+
+RK_FOR_PASS
+  : 'passo'
+  ;
+
 RK_BREAK
   : 'pare'
   ;
 
 RK_DO
-  : 'faca'
+  : 'repita'
+  ;
+
+RK_DO_UNTIL
+  : 'ate_que'
   ;
 
 RK_WHILE
   : 'enquanto'
   ;
 
+RK_WHILE_ALT
+  : 'repita_enquanto'
+  ;
+
 RK_IF
   : 'se'
   ;

+ 2 - 2
grammar/pt/langFunctions.js

@@ -2,8 +2,8 @@
 **/
 export default {
   main_function: "inicio",
-  $read: "entrada",
-  $write: "saida",
+  $read: "leia",
+  $write: "escreva",
   $numElements: "total_de_elementos",
   $matrixLines: "total_de_linhas",
   $matrixColumns: "total_de_colunas",

+ 0 - 89
i18n/en/error.json

@@ -1,89 +0,0 @@
-{
-  "token_missing_one": "Erro de sintaxe: Espera-se $0, mas encontrou-se $1 na linha:$2, coluna:$3",
-  "token_missing_two": "Erro de sintaxe: Esperava-se $0 ou $1 mas encontrou-se $2 na liha:$3, coluna: $4",
-  "eos_missing": "Falta uma nova linha ou ; na linha: $0, coluna: $1",
-  "invalid_type": "$0 na linha: $1, coluna: $2 é um tipo inválido. Os tipos válidos são: $3",
-  "invalid_array_dimension": "A dimensão inválida na linha: $0, coluna: $1. Insira um $2 ou identificador válido do mesmo tipo.",
-  "invalid_array_size": "O tamnho do vetor/matriz excede o máximo de 2 na linha $0",
-  "extra_lines": "Nenhum texto é permitido após '}' em 'programa {...}'",
-  "invalid_main_return": "A função $0 deve retornar $1 na linha $2",
-  "invalid_var_declaration": "Erro na linha $0. Variáveis só podem ser declarados no corpo principal da função e de preferência nas primeiras linhas.",
-  "invalid_break_command": "Erro na linha $0. O comando $1 não pode ser usado fora de uma estrutura de repetição ou 'escolha...caso'",
-  "invalid_terminal": "Não é possível utilizar $0 na expressão da linha: $1, coluna: $2. Tente um valor númerico, variável ou chamada de função.",
-  "const_not_init": "Erro na linha: $0, coluna: $1. Uma variável declarada como const deve ser inicializada",
-  "id_missing": "Esperava-se um identificador, mas encontrou-se $0 na linha: $1, coluna: $2",
-  "invalid_id_format": "$0 na linha: $1, coluna: $2 não é um identificador válido. O símbolo '.' não é permitido neste contexto.",
-  "main_missing": "A função principal não foi encontrada",
-  "invalid_global_var": "Erro crítico: Chamada inválida da função initGlobal fora do contexto BASE",
-  "not_implemented": "Erro interno crítico: A função definida pelo sistema $0 não foi implementada.",
-  "function_missing": "A função $0 não foi encontrada",
-  "function_missing_full": "A função $0 na linha: $1, coluna: $2 não foi encontrada",
-  "invalid_parameters_size_full": "Erro na linha $0: a quantidade de parâmetros fornecidos à função $1 está incorreta. Esperava-se $2, encontrou-se $3.",
-  "invalid_parameters_size": "A quantidade de parâmetros fornecidos à função $0 está incorreta. Esperava-se $1, encontrou-se $2",
-  "invalid_ref_full": "A expressão $0 fornecida como parâmetro para a função $1 na linha $2 não é válida para esta função. Use uma variável ou posição de vetor.",
-  "invalid_ref": "A expressão $0 fornecida como parâmetro para a função $1 não é válida para esta função. Use uma variável ou posição de vetor.",
-  "invalid_parameter_type_full": "A expressão $0 fornecida como parâmetro para a função $1 na linha $2 não é compatível com o tipo esperado.",
-  "invalid_parameter_type": "A expressão $0 fornecida como parâmetro para a função $1 não é compatível com o tipo esperado.",
-  "unknown_command_full": "Erro interno crítico: comando desconhecido encontrado na linha $0",
-  "unknown_command": "Erro interno crítico: comando desconhecido encontrado!",
-  "loop_condition_type_full": "Erro na linha: $0, coluna $1: a condição $2 do laço de repetição deve ser do tipo lógico",
-  "loop_condition_type": "A condição $0 do laço de repetição deve ser do tipo lógico",
-  "endless_loop_full": "Possível laço infinito detectado no seu código. Verifique a linha $0",
-  "endless_loop": "Possível laço infinito detectado no seu código.",
-  "for_condition_type_full": "Erro na linha: $0, coluna $1: a condição de parada $2 do comando para(...) deve ser do tipo lógico",
-  "for_condition_type": "A condição de parada $0 do comando para(...) deve ser do tipo lógico",
-  "if_condition_type_full": "Erro na linha: $0, coluna $1: a condição $2 do comando se...senao deve ser do tipo lógico",
-  "if_condition_type": "A condição $0 do comando se...senao deve ser do tipo lógico",
-  "invalid_return_type_full": "Erro na linha $0: a expressão não produz um tipo compatível com a função $1. Tipo esperado: $2.",
-  "invalid_return_type": "A expressão não produz um tipo compatível com a função $0. Tipo esperado: $1.",
-  "invalid_void_return_full": "Erro na linha $0: a função $1 não pode retornar uma expressão vazia, use uma espressão do tipo $2",
-  "invalid_void_return": "A função $0 não pode retornar uma expressão vazia, use uma espressão do tipo $1",
-  "unexpected_break_command_full": "Erro interno crítico: comando pare encontrado fora do contexto de um laço/escolha..caso na linha $0",
-  "unexpected_break_command": "Erro interno crítico: comando pare encontrado fora do contexto de um laço/escolha..caso",
-  "invalid_dimension": "As dimensões de um vetor/matriz devem ser do tipo inteiro",
-  "void_in_expression_full": "Erro na linha: $0, coluna: $1: a função $2 não pode ser utilizada em uma expressão pois seu tipo de retorno é vazio",
-  "void_in_expression": "A função $0 não pode ser utilizada em uma expressão pois seu tipo de retorno é vazio",
-  "invalid_array_access_full": "Identificador $0 na linha: $1, coluna: $2 não se refere a um vetor/matriz válido",
-  "invalid_array_access": "Identificador $0 não se refere a um vetor/matriz válido",
-  "invalid_matrix_access_full": "Identificador $0 na linha: $1, coluna: $2 não se refere a uma matriz válida",
-  "invalid_matrix_access": "Identificador $0 não se refere a uma matriz válida",
-  "matrix_column_outbounds_full": "Erro na linha $0: número de colunas $1 é inválido para a matriz $2 que possui $3 colunas",
-  "matrix_column_outbounds": "Número de colunas $0 é inválido para a matriz $1 que possui $2 colunas",
-  "matrix_line_outbounds_full": "Erro na linha $0: número de linhas $1 é inválido para a matriz $2 que possui $3 linhas",
-  "matrix_line_outbounds": "Número de linhas $0 é inválido para a matriz $1 que possui $2 linhas",
-  "vector_line_outbounds_full": "Erro na linha $0: número de linhas $1 é inválido para a matriz $2 que possui $3 linhas",
-  "vector_line_outbounds": "Número de linhas $0 é inválido para a matriz $1 que possui $2 linhas",
-  "vector_not_matrix_full": "Erro na linha $0: $1 não é uma matriz",
-  "vector_not_matrix": "$1 não é uma matriz",
-  "invalid_infix_op_full": "Erro na linha $0: não é possível aplicar a operação $1 entre os tipos $2 e $3",
-  "invalid_infix_op": "Não é possível aplicar a operação $0 entre os tipos $1 e $2",
-  "invalid_unary_op_full": "Erro na linha $0: não é possível aplicar a operação $1 ao tipo $2",
-  "invalid_unary_op": "Não é possível aplicar a operação $0 ao tipo $1",
-  "unknown_op": "Erro interno crítico: Operação $0 desconhecida",
-  "duplicate_function": "A função $0 na linha: $1, coluna: $2 já foi definida anteriormente.",
-  "duplicate_variable": "A variável $0 na linha: $1, coluna: $2 já foi declarada anteriormente.",
-  "main_parameters": "A função inicio não pode ter parâmetros.",
-  "symbol_not_found_full": "A variável $0 na linha: $1, coluna: $2 não foi declarada",
-  "symbol_not_found": "A variável $0 não foi declarada",
-  "array_dimension_not_int_full": "As dimensões de um vetor/matriz na linha: $0 devem ser do tipo inteiro.",
-  "array_dimension_not_int": "As dimensões de um vetor/matriz devem ser do tipo inteiro.",
-  "array_dimension_not_positive_full": "As dimensões de um vetor/matriz na linha: $0 devem ser valores positivos.",
-  "array_dimension_not_positive": "As dimensões de um vetor/matriz devem ser valores positivos.",
-  "incompatible_types_full": "O tipo $0 não é compatível com o tipo resultante da expressão na linha $1",
-  "incompatible_types": "O tipo $0 não é compatível com o tipo resultante da expressão fornecida.",
-  "incompatible_types_array_full": "A expressão $0 é incompatível com o tipo $1 na linha: $2, coluna: $3.",
-  "incompatible_types_array": "A expressão $0 é incompatível com o tipo $1.",
-  "invalid_case_type_full": "O caso $0 na linha $1 é incompatível com o tipo $2.",
-  "invalid_case_type": "O caso $0 é incompatível com o tipo $1.",
-  "function_no_return": "A função $0 não possui um retorno acessível. Toda função deve ter ao menos um retorno no seu corpo principal.",
-  "invalid_array_literal_type_full": "Erro na linha $0: a expressão $1 não resulta em um tipo compatível.",
-  "invalid_array_literal_type": "A expressão $0 não resulta em um tipo compatível.",
-  "invalid_array_literal_line_full": "Erro na linha $0: esperava-se $1 linhas mas encontrou $2.",
-  "invalid_array_literal_line": "Esperava-se $0 linhas mas encontrou $1.",
-  "invalid_array_literal_column_full": "Erro na linha $0: esperava-se $1 colunas mas encontrou $2.",
-  "invalid_array_literal_column": "Esperava-se $0 colunas mas encontrou $1.",
-  "exceeded_input_request": "A quantidade de leituras requisitadas execedeu a quantidade de entradas disponíveis.",
-  "test_case_few_reads": "Caso de teste $0 falhou: ainda restam entradas!",
-  "test_case_failed": "Caso de teste $0 falhou: entradas:<$1>; saída esperada:<$2>; saída:<$3>",
-  "test_case_failed_exception": "Caso de teste $0 falhou: $1"
-}

+ 0 - 9
i18n/en/index.js

@@ -1,9 +0,0 @@
-import errors from './error.json';
-import messages from './message.json'
-import ui from './ui.json';
-
-export default {
- 'message' : messages,
- 'error': errors,
- 'ui': ui
-}

+ 0 - 4
i18n/en/message.json

@@ -1,4 +0,0 @@
-{
-  "test_case_success": "Caso de teste $0: OK",
-  "test_case_duration": "Levou $0ms"
-}

+ 0 - 148
i18n/en/ui.json

@@ -1,148 +0,0 @@
-{
-  "function": "function",
-  "btn_clear": "Clear",
-  "btn_function": "Function",
-  "btn_arithmetic_plus": "Sum",
-  "btn_arithmetic_minus": "Minus",
-  "btn_arithmetic_multiplication": "Multiplication",
-  "btn_arithmetic_division": "Division",
-  "btn_arithmetic_module": "Module",
-  "btn_break":"Break",
-  "btn_case":"Case",
-  "start": "start",
-  "void": "void",
-  "integer": "integer",
-  "real": "real",
-  "program": "program",
-  "text": "string",
-  "text_start": "text",
-  "boolean": "boolean",
-  "true": "true",
-  "false": "false",
-  "variable": "Variable",
-  "command": "Command",
-  "new_parameter": "parameter",
-  "new_variable": "variable",
-  "new_global": "global",
-  "new_function": "new_function",
-  "matrix": "matrix",
-  "vector": "vector",
-  "text_comment_start": "Initial comment of function...",
-  "text_comment_main": "This is the main function...",
-  "text_read_var": "Reading data",
-  "text_write_var": "Writing data",
-  "text_command_read":"read",
-  "text_command_write":"write",
-  "text_comment": "Comment",
-  "text_attribution": "Attribution",
-  "text_if":"if",
-  "text_else":"else",
-  "text_break":"break",
-  "text_for":"for",
-  "text_code_while":"while",
-  "text_code_do":"do",
-  "text_command_do":"do",
-  "text_code_switch": "switch",
-  "text_code_case": "case",
-  "text_config_programming":"Programming",
-  "text_config_programming_both":"Visual and textual",
-  "text_config_programming_textual":"Textual",
-  "text_config_programming_visual":"Visual",
-  "text_logic_expression": "Logic Expression",
-  "text_arithmetic_expression": "Relational Expression",
-  "text_iftrue": "If true then",
-  "text_message_error_activity_file": "There was an error processing the activity. <br>Please reload the page and try again.",
-  "text_message_error_activity_reload": "Reload",
-  "text_receives": "receives",
-  "text_repeatNtimes": "Repeat N times",
-  "text_return":"return",
-  "text_btn_return":"Return",
-  "text_whiletrue": "While true",
-  "text_dowhiletrue": "Do while true",
-  "text_switch": "Switch",
-  "text_functioncall": "Function call",
-  "text_value": "Value",
-  "text_operator": "Operator",
-  "text_parentheses": "Parentheses",
-  "text_change": "Change",
-  "text_teacher_algorithm": "Algorithm",
-  "text_teacher_algorithm_include": "Include the following algorithm in exercise",
-  "text_teacher_test_case": "Test cases",
-  "text_teacher_config": "Settings",
-  "text_teacher_data_types": "Data types",
-  "text_teacher_commands": "Commands",
-  "text_teacher_functions": "Functions",
-  "text_teacher_create_functions": "Create new functions",
-  "text_teacher_create_movement_functions": "Move functions",
-  "text_teacher_test_case_input": "Input",
-  "text_teacher_test_case_output": "Output",
-  "text_teacher_test_case_actions": "Actions",
-  "text_teacher_test_case_add": "Add test cases",
-  "text_header_ivprog_functions": "iVProg Functions",
-  "text_menu_functions_math":"Mathematic",
-  "text_menu_functions_text":"Text",
-  "text_menu_functions_arrangement":"Arrangement",
-  "text_menu_functions_conversion":"Conversion",
-  "text_none_variable":"There is no declared variable",
-  "text_none_variable_instruction":"Create a new variable to use it",
-  "text_ivprog_description":"Interactive Visual Programming on the Internet",
-  "tooltip_visual": "Visual programming",
-  "tooltip_textual": "Textual programming",
-  "tooltip_upload": "Upload code file",
-  "tooltip_download": "Download code file",
-  "tooltip_undo": "Undo",
-  "tooltip_redo": "Redo",
-  "tooltip_run": "Run program",
-  "tooltip_evaluate": "Evaluate program",
-  "tooltip_help": "Help",
-  "tooltip_add_global": "Add global variable",
-  "tooltip_minimize": "Hidde function elements",
-  "tooltip_console": "Open/Close console",
-  "var_menu_select_var": "Select a var",
-  "var_menu_select_all": "Select",
-  "var_menu_select_function": "Select a function",
-  "expression_menu_select": "Construct any logical condition",
-  "math": "Mathematic",
-  "text_t": "Text",
-  "inform_valid_name": "Inform a valid name!",
-  "inform_valid_content": "Enter some content!",
-  "inform_valid_expression": "Construct the logical condition!",
-  "inform_valid_name_duplicated": "This name is already in use by other function.",
-  "inform_valid_global_duplicated": "A global variable with this name already exists.",
-  "inform_valid_variable_duplicated" : "A local variable with this name already exists.",
-  "arrangement": "Arrangement",
-  "conversion": "Conversion",
-  "$sin": "sin",
-  "$cos": "cos",
-  "$tan": "tan",
-  "$sqrt": "sqrt",
-  "$pow": "pow",
-  "$log": "log",
-  "$abs": "abs",
-  "$negate": "negate",
-  "$invert": "invert",
-  "$max": "maximum",
-  "$min": "minimum",
-  "$rand":"random",
-  "$substring": "substring",
-  "$length": "length",
-  "$uppercase": "uppercase",
-  "$lowercase": "lowercase",
-  "$charAt": "char_at",
-  "$numElements": "total_of_elements",
-  "$matrixLines": "total_of_lines",
-  "$matrixColumns": "total_of_columns",
-  "$isReal": "is_real",
-  "$isInt": "is_integer",
-  "$isBool": "is_logic",
-  "$castReal": "to_real",
-  "$castInt": "to_integer",
-  "$castBool": "to_logic",
-  "$castString": "to_string",
-  "text_ivprog_version":"Version",
-  "text_teacher_filter": "Filter",
-  "text_teacher_filter_active": "Activate",
-  "text_teacher_filter_help": "When filter is activated, all iVProg modifications will be blocked.",
-  "text_teacher_generate_outputs": "Generate outputs",
-  "text_teacher_generate_outputs_algorithm": "Before generate outputs, create an algorithm!"
-}

+ 131 - 0
i18n/error.csv

@@ -0,0 +1,131 @@
+id,pt,en ,es
+token_missing_one,"Erro de sintaxe: Espera-se $0, mas encontrou-se $1 na linha:$2, coluna:$3","Syntax error: Expected $0 but found $1 at line:$2, column:$3", 
+token_missing_two,"Erro de sintaxe: Esperava-se $0 ou $1 mas encontrou-se $2 na liha:$3, coluna: $4","Syntax error: Expected $0 or $1 but found $2 at line:$3, column: $4", 
+eos_missing,"Falta uma nova linha ou ; na linha: $0, coluna: $1","A new line or a ‘;’ is missing at line: $0, column: $1", 
+invalid_type,"$0 na linha: $1, coluna: $2 é um tipo inválido. Os tipos válidos são: $3","$0 at line: $1, column: $2 is a invalid type. The valid types are: $3", 
+invalid_array_dimension,"A dimensão inválida na linha: $0, coluna: $1. Insira um $2 ou identificador válido do mesmo tipo.","Invalid dimension at line: $0, column: $1. Insert a $2 or a valid identifier of the same type.", 
+invalid_array_size,O tamnho do vetor/matriz excede o máximo de 2 na linha $0,The array at line $0 exceeds the maximum size of 2., 
+extra_lines,Nenhum texto é permitido após '}' em 'programa {...}',No text is allowed after '}' in 'program { … }', 
+invalid_main_return,A função $0 declarada na linha $2 deve retornar $1.,The function $0 declared at line $2 must return $1., 
+invalid_var_declaration,"Erro na linha $0: variáveis só podem ser declaradas no corpo principal da função e nas primeiras linhas, antes de qualquer comando.","Error at line $0: Variables can only be declared in the main body of a function and at the first lines, before any command.", 
+invalid_break_command,Erro na linha $0. O comando $1 não pode ser usado fora de uma estrutura de repetição ou 'escolha...caso',Error at line $0. The command $1 cannot be used outside a loop command or ‘switch ...case’ structure., 
+invalid_terminal,"Não é possível utilizar $0 na expressão da linha: $1, coluna: $2. Tente um valor númerico, variável ou chamada de função.","It is not possible to use $0 in the expression at line: $1, column: $2. Try a numeric value, variable or function call.", 
+const_not_init,"Erro na linha: $0, coluna: $1. Uma variável declarada como const deve ser inicializada","Error at line: $0, column: $1. A variable declared as const must be initialized.", 
+id_missing,"Esperava-se um identificador, mas encontrou-se $0 na linha: $1, coluna: $2","Expected an identifier but found $0 at line: $1, column: $2.", 
+invalid_id_format,"$0 na linha: $1, coluna: $2 não é um identificador válido. O símbolo '.' não é permitido neste contexto.","$0 at line: $1, column: $2 is not a valid identifier. The symbol '.' is not permitted in this context.", 
+main_missing,A função principal não foi encontrada,The main function was not found. You need to declare a function of return type void named main., 
+invalid_global_var,Erro crítico: Chamada inválida da função initGlobal fora do contexto BASE,Critical Error: Invalid call of the function IVProgProcessor.initGlobal outside the BASE context., 
+not_implemented,Erro interno crítico: A função definida pelo sistema $0 não foi implementada.,Critial internal error: The system defined function $0 was not found., 
+function_missing,A função $0 não foi encontrada,The function $0 was not found., 
+function_missing_full,"A função $0 na linha: $1, coluna: $2 não foi encontrada","The function $0 at line: $1, column: $2 was not found.", 
+invalid_parameters_size_full,"Erro na linha $0: a quantidade de parâmetros fornecidos à função $1 está incorreta. Esperava-se $2, encontrou-se $3.",Error at line $0: The number of parameters provided to the function $1 is incorrect. It expected $2 but found $3., 
+invalid_parameters_size,"A quantidade de parâmetros fornecidos à função $0 está incorreta. Esperava-se $1, encontrou-se $2",The number of parameters provided to the function $0 is incorrect. It expected $1 but found $2., 
+invalid_ref_full,A expressão $0 fornecida como parâmetro para a função $1 na linha $2 não é válida para esta função. Use uma variável ou posição de vetor.,The expression $0 provided as a parameter to the function $1 at line $2 is not valid in this context. Use a variable or a position of a vector., 
+invalid_ref,A expressão $0 fornecida como parâmetro para a função $1 não é válida para esta função. Use uma variável ou posição de vetor.,The expression $0 provided as a parameter to the function $1 is not valid in this context. Use a variable or a position of a vector., 
+invalid_parameter_type_full,A expressão $0 fornecida como parâmetro para a função $1 na linha $2 não é compatível com o tipo esperado.,The expression $0 provided as a parameter to the function $1 at line $2 is not of the expected type., 
+invalid_parameter_type,A expressão $0 fornecida como parâmetro para a função $1 não é compatível com o tipo esperado.,The expression $0 provided as a parameter to the function $1 is not of the expected type., 
+unknown_command_full,Erro interno crítico: comando desconhecido encontrado na linha $0,Internal error: an unknown command found at line $0., 
+unknown_command,Erro interno crítico: comando desconhecido encontrado!,Internal error: an unknown command found., 
+loop_condition_type_full,"Erro na linha: $0, coluna $1: a condição $2 do laço de repetição deve ser do tipo lógico","Error at line: $0, column $1: the condition $2 of the loop must be of type bool (true or false).", 
+loop_condition_type,A condição $0 do laço de repetição deve ser do tipo lógico,The condition $0 of the loop must be of type bool (true or false)., 
+endless_loop_full,Possível laço infinito detectado no seu código. Verifique a linha $0,Possible infinite loop detected in your code. Check line $0., 
+endless_loop,Possível laço infinito detectado no seu código.,Possible infinite loop detected in your code., 
+for_condition_type_full,"Erro na linha: $0, coluna $1: a condição de parada $2 do comando para(...) deve ser do tipo lógico","Erro na linha: $0, coluna $1: a condição de parada $2 do comando para(...) deve ser do tipo lógico", 
+for_condition_type,A condição de parada $0 do comando para(...) deve ser do tipo lógico,A condição de parada $0 do comando para(...) deve ser do tipo lógico, 
+if_condition_type_full,"Erro na linha: $0, coluna $1: a condição $2 do comando se...senao deve ser do tipo lógico","Error at line: $0, column $1: the condition $2 in the if … else command must result in a bool (true or false).", 
+if_condition_type,A condição $0 do comando se...senao deve ser do tipo lógico,The condition $0 in the if … else command must result in a bool (true or false)., 
+invalid_return_type_full,Erro na linha $0: a expressão não produz um tipo compatível com a função $1. Tipo esperado: $2.,Error at line $0: The expression doest not result in a type compatible with the function $1.  Expected type: $2., 
+invalid_return_type,A expressão não produz um tipo compatível com a função $0. Tipo esperado: $1.,The expression doest not result in a type compatible with the function $0.  Expected type: $1., 
+invalid_void_return_full,"Erro na linha $0: a função $1 não pode retornar uma expressão vazia, use uma espressão do tipo $2","Error at line $0: The function $1 cannot return an empty expression, use an expression that results in a $2", 
+invalid_void_return,"A função $0 não pode retornar uma expressão vazia, use uma espressão do tipo $1","The function $0 cannot return an empty expression, use an expression that results in a $1", 
+unexpected_break_command_full,Erro interno crítico: comando pare encontrado fora do contexto de um laço/escolha..caso na linha $0,Critical error at line $0:  a break command was found outside a valid context: loop or switch … case structure., 
+unexpected_break_command,Erro interno crítico: comando pare encontrado fora do contexto de um laço/escolha..caso,Critical error:  a break command was found outside a valid context: loop or switch … case structure., 
+invalid_dimension,As dimensões de um vetor/matriz devem ser do tipo inteiro,Array (vector or matrix) dimensions must be of type int., 
+void_in_expression_full,"Erro na linha: $0, coluna: $1: a função $2 não pode ser utilizada em uma expressão pois seu tipo de retorno é vazio","Error at line: $0, column: $1: The function $2 cannot be used inside an expression since its return type is void.", 
+void_in_expression,A função $0 não pode ser utilizada em uma expressão pois seu tipo de retorno é vazio,The function $0 cannot be used inside an expression since its return type is void., 
+invalid_array_access_full,"Identificador $0 na linha: $1, coluna: $2 não se refere a um vetor/matriz válido","Identifier $0 at line: $1, column: $2 does not identify a valid vector or matrix.", 
+invalid_array_access,Identificador $0 não se refere a um vetor/matriz válido,Identifier $0 does not identify a valid vector or matrix., 
+invalid_matrix_access_full,"Identificador $0 na linha: $1, coluna: $2 não se refere a uma matriz válida","Identifier $0 at line: $1, column: $2 does not identify a valid matrix.", 
+invalid_matrix_access,Identificador $0 não se refere a uma matriz válida,Identifier $0 does not identify a valid matrix., 
+matrix_column_outbounds_full,Erro na linha $0: número de colunas $1 é inválido para a matriz $2 que possui $3 colunas,Error at line $0: The number of columns $1 is invalid for the matrix $2 which has $3 columns., 
+matrix_column_outbounds,Número de colunas $0 é inválido para a matriz $1 que possui $2 colunas,The number of columns $0 is invalid for the matrix $1 which has $2 columns., 
+matrix_line_outbounds_full,Erro na linha $0: número de linhas $1 é inválido para a matriz $2 que possui $3 linhas,Error at line $0: The number of lines $1 is invalid for matrix $2 which has $3 lines., 
+matrix_line_outbounds,Número de linhas $0 é inválido para a matriz $1 que possui $2 linhas,The number of lines $0 is invalid for matrix $1 which has $2 lines., 
+vector_line_outbounds_full,Erro na linha $0: O número de elementos $1 é inválido para a vetor $2 que possui $3 elementos.,Error at line $0: The number of elements $1 is invalid for vector $2 which has $3 elements., 
+vector_line_outbounds,O número de elementos $1 é inválido para a vetor $2 que possui $3 elementos.,Error at line $0: The number of elements $1 is invalid for vector $2 which has $3 elements., 
+vector_not_matrix_full,Erro na linha $0: $1 não é uma matriz,Error at line $0: $1 is not a matrix., 
+vector_not_matrix,$0 não é uma matriz,$0 is not a matrix., 
+invalid_infix_op_full,"Erro na linha $0: a expressão $1 é inválida, pois o operador $2 não pode ser aplicado aos tipos $3 e $4",Error at line $0:  The expression $1 is not valid because the operator $2 cannot be applied to the types $3 and $4., 
+invalid_infix_op,"A expressão $0 é inválida, pois o operador $1 não pode ser aplicado aos tipos $2 e $3",The expression $0 is not valid because the operator $1 cannot be applied to the types $2 and $3., 
+invalid_unary_op_full,"Erro na linha $0: a expressão $1 é inválida, pois o operador $2 não pode ser aplicado ao tipo $3",Error at line $0:  The expression $1 is not valid because the operator $2 cannot be applied to the type $3., 
+invalid_unary_op,"A expressão $0 é inválida, pois o operador $1 não pode ser aplicado ao tipo $2",The expression $0 is not valid because the operator $1 cannot be applied to the type $2., 
+unknown_op,Erro interno crítico: Operação $0 desconhecida,Critical error: Unknown operator $0., 
+duplicate_function,"A função $0 na linha: $1, coluna: $2 já foi definida anteriormente.","The function $0 at line: $1, column: $2 has already been declared.", 
+duplicate_variable,"A variável $0 na linha: $1, coluna: $2 já foi declarada anteriormente.","The variable $0 at line: $1, column: $2 has already been declared.", 
+main_parameters,A função inicio não pode ter parâmetros.,The main function cannot have parameters., 
+symbol_not_found_full,"A variável $0 na linha: $1, coluna: $2 não foi declarada","The variable $0 at line: $1, column: $2 has not been declared.", 
+symbol_not_found,A variável $0 não foi declarada,The variable $0 has not been declared., 
+array_dimension_not_int_full,As dimensões do arranjo (vetor ou matriz) na linha $0 devem ser do tipo inteiro.,The array (vector or matrix) dimensions at line $0 must be of type int., 
+array_dimension_not_int,As dimensões de um arranjo (vetor ou matriz) devem ser do tipo inteiro.,An array (vector or matrix) dimensions must be of type int., 
+array_dimension_not_positive_full,As dimensões do arranjo (vetor ou matriz) na linha $0 devem ser valores positivos.,The array (vector or matrix) dimensions at line $0 must be positive., 
+array_dimension_not_positive,As dimensões de um arranjo (vetor ou matriz) devem ser valores positivos.,An array (vector or matrix) dimensions must be positive., 
+incompatible_types_full,Era esperado um $0 mas a expressão $1 na linha $2 resulta em $3.,It expected $0 but the expression $1 at line $2 results in $3., 
+incompatible_types,Era esperado um $0 mas a expressão $1 resulta em $2.,It expected $0 but the expression $1 results in $2., 
+incompatible_types_array_full,A expressão $0 na linha $2 é incompatível com o tipo $1.,The expression $0 at line $2 is not compatible with type $1., 
+incompatible_types_array,A expressão $0 é incompatível com o tipo $1.,The expression $0 is not compatible with type $1., 
+invalid_case_type_full,O caso $0 na linha $1 é incompatível com o tipo $2.,The case expression $0 at line $1 is not compatible with type $2., 
+invalid_case_type,O caso $0 é incompatível com o tipo $1.,The case expression $0 is not compatible with type $1., 
+function_no_return,A função $0 não possui um comando de devolução acessível. Toda função deve ter ao menos um comando 'devolva' no seu corpo principal.,The function $0 does not have a reacheable return command. Every function must have at least one return command in its main body., 
+invalid_array_literal_type_full,Erro na linha $0: a expressão $1 não resulta em um tipo compatível.,Error at line $0: the expression $1 does not result in a compatible type., 
+invalid_array_literal_type,A expressão $0 não resulta em um tipo compatível.,The expression $0 does not result in a compatible type., 
+invalid_array_literal_line_full,Erro na linha $0: esperava-se $1 linhas mas encontrou $2.,Error at line $0: it expected $1 lines but found $2., 
+invalid_array_literal_line,Esperava-se $0 linhas mas encontrou $1.,It expected $0 lines but found $1., 
+invalid_array_literal_column_full,Erro na linha $0: esperava-se $1 colunas mas encontrou $2.,Error at line $0: it expected $1 column but found $2., 
+invalid_array_literal_column,Esperava-se $0 colunas mas encontrou $1.,It expected $0 column but found $1., 
+exceeded_input_request,A quantidade de leituras requisitadas execedeu a quantidade de entradas disponíveis.,The amount of reads requested exceeded the amount of inputs available., 
+test_case_few_reads,Caso de teste $0 falhou: ainda restam entradas!,Teste case $0 failed: there are available inputs remaining., 
+test_case_failed,"<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=""$1""> <span>Caso de teste $0 não executou com sucesso.</span></div>","<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=""$1""> <span>Test case $0 did not executed successfully.</span></div>", 
+test_case_failed_exception,"<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=""$2""> <span>Caso de teste $0 falhou</span>: $1","<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=""$2""> <span>Test case $0 failed</span>: $1", 
+test_case_exception,Ocorreu uma exceção no caso de teste $0: $1,An exception has ocurred during the execution of test case $0: $1, 
+invalid_type_conversion,O valor $0 não pode ser convertido para o tipo $1,The value $0 cannot be converted to type $1., 
+invalid_read_type,"Erro na linha $0: A entrada ""$1"" não é do tipo $2, que é o tipo da variável <span class='ivprog-error-varname'>$3</span>.","Error at line $0: The input ""$1"" is not of type $2 which is the type of the variable <span class='ivprog-error-varname'>$3</span>.", 
+invalid_read_type_array,"Erro na linha $0: A entrada ""$1"" não é do tipo $2, que é o tipo aceito pela variável <span class='ivprog-error-varname'>$3</span> que é um $4.","Error at line $0: The input ""$1"" is not of type $2 which is the type  accepted by the variable <span class='ivprog-error-varname'>$3</span> of type $4.", 
+inform_valid_identifier,"Informe um nome válido! O nome não pode ser uma palavra reservadas e deve começar com letras ou _ e conter apenas letras, números e _.","Enter a valid identifier! The identifier cannot be a reserved word and it must begin with a letter or _, followed by numbers, letters and _ only.", 
+inform_valid_global_duplicated,"Já existe uma variável global com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.","A global variable named <span class='ivprog-error-varname'>$0</span> already exists, you need distinct names for each gloval variable.", 
+inform_valid_variable_duplicated,"Já existe uma variável com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos.","A variable named <span class='ivprog-error-varname'>$0</span> already exists, you need distinct names for each variable.", 
+inform_valid_function_duplicated,"Já existe uma função com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.","A function named <span class='ivprog-error-varname'>$0</span> already exists, you need distinct names for each function.", 
+inform_valid_param_duplicated,"Já existe um parâmetro com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos.","A parameter named <span class='ivprog-error-varname'>$0</span> already exists in function <span class='ivprog-error-varname'>$1</span>, you need distinc names for each parameter.", 
+invalid_character,O caractere $0 na linha $1 não pode ser utilizado neste contexto.,The character $0 at line $1 cannot be used in this context., 
+annonymous_array_literal,"Erro na linha $0: a notação de vetor/matriz só permitida durante a inicialização de uma variável desse tipo. Ex: inteiro vec[3] ← {1,2,3}.","Error at line $0: the array notation is only permitted during initialization of an array variable. i. e.: int vec[3] ← {1, 2, 3}.", 
+invalid_matrix_literal_line,A expressão $0 na linha $1 não possui um número de elementos igual a linha anterior. Todas as linhas de uma matriz devem ter a mesma quantidade de elementos.,The expression $0 at line $1 does not have the same number of elements as the last line. All lines of a matrix must have the same number of elements., 
+cannot_infer_matrix_line,Não é possível inferir o número de linhas da matriz $0 na linha $1. É necessário que ela seja inicializada ou que o valor seja informado de forma explícita.,It is not possible to infer the number of lines of matrix $0 at line $1. It must be initialized or have its lines explicitly declared., 
+cannot_infer_matrix_column,Não é possível inferir o número de colunas da matriz $0 na linha $1. É necessário que ela seja inicializada ou que o valor seja informado de forma explícita.,It is not possible to infer the number of columns of matrix $0 at line $1. It must be initialized or have its columns explicitly declared., 
+cannot_infer_vector_size,Não é possível inferir o número de elementos do vetor $0 na linha $1. É necessário que ele seja inicializado ou que o valor seja informado de forma explícita,It is not possible to infer the number of elements of vector $0 at line $1. It must be initialized or have its size explicitly declard., 
+matrix_to_vector_literal_attr,Erro na linha $0: A expressão $1 representa uma matriz e não pode ser atribuída ao vetor $2.,Error at line $0: The expression $1 represents a matrix and cannot be assigned to the vector $2., 
+vector_to_matrix_literal_attr,Erro na linha $0: A expressão $1 representa um vetor e não pode ser atribuído a matriz $2.,Error at line $0: The expression $1 represents a vector and cannot be assigned to the matrix $2., 
+invalid_const_ref_full,A variável $0 fornecida como parâmetro para a função $1 na linha $2 é uma constante e não pode ser usada neste contexto. Use uma variável ou posição de vetor.,The variable $0 provided as a parameter to the function $1 at line $2 is a constant and cannot be used in this context. Use a non-constant variable or vector position., 
+invalid_const_ref,A variável $0 fornecida como parâmetro para a função $1 é uma constante e não pode ser usada neste contexto. Use uma variável ou posição de vetor.,The variable $0 provided as a parameter to the function $1 is a constant and cannot be used in this context. Use a non-constant variable or vector position., 
+invalid_const_assignment_full,Erro na linha $0: $1 é uma constante e portanto não pode ter seu valor alterado,Error at line $0: $1 is a constant e therefore cannot have its value changed., 
+invalid_const_assignment,$0 é uma constante e portanto não pode ter seu valor alterado,$0 is a constant e therefore cannot have its value changed., 
+array_init_not_literal,"Erro na linha $0: Vetor/Matriz só pode ser inicializado por literal. Ex: real vetor[] <- {1,2,3}","Error at line $0: An array (vector or matrix) can only be initialized by an array literal. i.e : real vector[] <- {1,2,3}", 
+array_exceeds_2d,Erro na linha $0: O número máximo de dimensões que um arranjo pode ter é 2. Elemento de 3 ou mais dimensões encontrado!,Error at line $0: The maximum number of dimensions an array can have is 2. An element of 3 or dimensions was found., 
+invalid_matrix_id_dimension,"Erro na linha $0: Você deve definir todas as dimensões da matriz quando uma delas é definida por uma variável! Ex: real mat1[var][5], mat2[5][var]","Error at line $0: You must define all dimensions of the matrix when one of them is defined by a variable! i.e: real mat1[var][5], mat2[5][var]", 
+invalid_vector_init,Erro na linha $0: Não se pode inicializar um vetor que teve seu tamanho declarado utilizando uma variável! Utilize uma atribuição de vetores ou use um laço de repetição.,Error at line $0: You cannot initialize a vector when its size is defined by a variable. Use a vector assignment or loop command., 
+invalid_matrix_init,Erro na linha $0: Não se pode inicializar uma matrix que teve ao menos uma das suas dimensões declaradas utilizando uma variável! Utilize uma atribuição de matrizes ou use um laço de repetição.,Error at line $0: You cannot initialize a matrix when one of its dimensions is defined by a variable. Use a matrix assignment or loop command., 
+invalid_vector_assignment_full,Erro na linha $0: Só se pode atribuir um vetor a outro desde que eles comportem o mesmo número de elementos. $1 comporta $2 e $3 comporta $4!,Error at line $0: You can only assign a vector to another when both have the same number of elements. $1 has $2 and $3 has $4 elements!, 
+invalid_vector_assignment,Só se pode atribuir um vetor a outro desde que eles comportem o mesmo número de elementos. $0 comporta $1 e $2 comporta $3!,You can only assign a vector to another when both have the same number of elements. $0 has $1 and $2 has $3 elements!, 
+invalid_matrix_assignment_full,"Erro na linha $0: Só se pode atribuir uma matriz a outra desde que ambas possuam dimensões de mesmo tamanho. $1 tem $2 linhas e $3 colunas, enquanto $4 possui $5 linhas e $6 colunas!",Error at line $0: You can only assign a matrix to another when both have dimensions of the same size. $1 has $2 lines e $3 columns while $4 has $5 lines and $6 columns!, 
+invalid_matrix_assignment,"Só se pode atribuir uma matriz a outra desde que ambas possuam dimensões de mesmo tamanho. $0 tem $1 linhas e $2 colunas, enquanto $3 possui $4 linhas e $5 colunas!",You can only assign a matrix to another when both have dimensions of the same size. $0 has $1 lines e $2 columns while $3 has $4 lines and $5 columns!, 
+matrix_to_vector_attr,Erro na linha $0: $1 representa uma matriz e não pode ser atribuída ao vetor $2.,Error at line $0: $1 represents a matrix and cannot be assigned to the vector $2., 
+vector_to_matrix_attr,Erro na linha $0: $1 representa um vetor e não pode ser atribuído a matriz $2.,Error at line $0: $1 represents a vector and cannot be assigned to the matrix $2., 
+invalid_matrix_index_assign_full,"Erro na linha $0: A posição $1 da matriz $2 aceita apenas vetores de tamanho $3, mas $4 tem tamanho $5",Error at line $0: The position $1 of the matrix $2 only accepts vectors of size $3 but $4 has size $5., 
+invalid_matrix_index_assign,"A linha $0 da matriz $1 aceita apenas vetores de tamanho $2, mas $3 tem tamanho $4",The position $0 of the matrix $1 only accepts vectors of size $2 but $3 has size $4., 
+invalid_number_elements_vector,Esperava-se por $0 elementos na linha $1 mas a expressão $2 possui $3 elementos.,It expected $0 elements at line $1 but the expression $2 has $3 elements., 
+invalid_number_lines_matrix,Esperava-se por uma matriz com $0 linhas na linha $1 mas a expressão $2 possui $3 linhas,It expected a matrix with $0 lines at line $1 but the expression $2 has $3 lines., 
+divsion_by_zero_full,Erro na linha $0: A expressão $1 resulta em uma divisão por 0.,Error at line $0: The expression $1 resuts in a division by zero., 
+divsion_by_zero,A expressão $0 resulta em uma divisão por 0.,The expression $0 resuts in a division by zero., 
+undefined_tanget_value,Erro na linha $0: A tangente de $1° não é indefinida.,Error at line $0: The tangent of $1° is undefined., 
+negative_log_value,Erro na linha $0: Não se pode calcular o log de um valor negativo.,Error at line $0: You cannot calculate the logarithm of a negative value., 
+invalid_string_index,Erro na linha $0 durante a execução da função $1: $2 é um índice inválido para a cadeia de texto $3. Os valores válidos vão de 0 à $4,Error at line $0 during the execution of the function $1: $2 is an invalid index for the text string $3. The valid indexes go from 0 to $4., 
+negative_sqrt_value,Erro na linha $0: Não é permitido calcular a raiz quadrada de um número negativo.,Error at line $0: It is not allowd to calculate the square root of a negative number., 
+exceeded_recursive_calls,Erro na execução da linha $0: Número de chamadas recursivas execedeu o limite máximo definido!,Error during the execution of line $0: The number of recursive calls exceeded the allowed number of calls., 

+ 0 - 89
i18n/es/error.json

@@ -1,89 +0,0 @@
-{
-  "token_missing_one": "Erro de sintaxe: Espera-se $0, mas encontrou-se $1 na linha:$2, coluna:$3",
-  "token_missing_two": "Erro de sintaxe: Esperava-se $0 ou $1 mas encontrou-se $2 na liha:$3, coluna: $4",
-  "eos_missing": "Falta uma nova linha ou ; na linha: $0, coluna: $1",
-  "invalid_type": "$0 na linha: $1, coluna: $2 é um tipo inválido. Os tipos válidos são: $3",
-  "invalid_array_dimension": "A dimensão inválida na linha: $0, coluna: $1. Insira um $2 ou identificador válido do mesmo tipo.",
-  "invalid_array_size": "O tamnho do vetor/matriz excede o máximo de 2 na linha $0",
-  "extra_lines": "Nenhum texto é permitido após '}' em 'programa {...}'",
-  "invalid_main_return": "A função $0 deve retornar $1 na linha $2",
-  "invalid_var_declaration": "Erro na linha $0. Variáveis só podem ser declarados no corpo principal da função e de preferência nas primeiras linhas.",
-  "invalid_break_command": "Erro na linha $0. O comando $1 não pode ser usado fora de uma estrutura de repetição ou 'escolha...caso'",
-  "invalid_terminal": "Não é possível utilizar $0 na expressão da linha: $1, coluna: $2. Tente um valor númerico, variável ou chamada de função.",
-  "const_not_init": "Erro na linha: $0, coluna: $1. Uma variável declarada como const deve ser inicializada",
-  "id_missing": "Esperava-se um identificador, mas encontrou-se $0 na linha: $1, coluna: $2",
-  "invalid_id_format": "$0 na linha: $1, coluna: $2 não é um identificador válido. O símbolo '.' não é permitido neste contexto.",
-  "main_missing": "A função principal não foi encontrada",
-  "invalid_global_var": "Erro crítico: Chamada inválida da função initGlobal fora do contexto BASE",
-  "not_implemented": "Erro interno crítico: A função definida pelo sistema $0 não foi implementada.",
-  "function_missing": "A função $0 não foi encontrada",
-  "function_missing_full": "A função $0 na linha: $1, coluna: $2 não foi encontrada",
-  "invalid_parameters_size_full": "Erro na linha $0: a quantidade de parâmetros fornecidos à função $1 está incorreta. Esperava-se $2, encontrou-se $3.",
-  "invalid_parameters_size": "A quantidade de parâmetros fornecidos à função $0 está incorreta. Esperava-se $1, encontrou-se $2",
-  "invalid_ref_full": "A expressão $0 fornecida como parâmetro para a função $1 na linha $2 não é válida para esta função. Use uma variável ou posição de vetor.",
-  "invalid_ref": "A expressão $0 fornecida como parâmetro para a função $1 não é válida para esta função. Use uma variável ou posição de vetor.",
-  "invalid_parameter_type_full": "A expressão $0 fornecida como parâmetro para a função $1 na linha $2 não é compatível com o tipo esperado.",
-  "invalid_parameter_type": "A expressão $0 fornecida como parâmetro para a função $1 não é compatível com o tipo esperado.",
-  "unknown_command_full": "Erro interno crítico: comando desconhecido encontrado na linha $0",
-  "unknown_command": "Erro interno crítico: comando desconhecido encontrado!",
-  "loop_condition_type_full": "Erro na linha: $0, coluna $1: a condição $2 do laço de repetição deve ser do tipo lógico",
-  "loop_condition_type": "A condição $0 do laço de repetição deve ser do tipo lógico",
-  "endless_loop_full": "Possível laço infinito detectado no seu código. Verifique a linha $0",
-  "endless_loop": "Possível laço infinito detectado no seu código.",
-  "for_condition_type_full": "Erro na linha: $0, coluna $1: a condição de parada $2 do comando para(...) deve ser do tipo lógico",
-  "for_condition_type": "A condição de parada $0 do comando para(...) deve ser do tipo lógico",
-  "if_condition_type_full": "Erro na linha: $0, coluna $1: a condição $2 do comando se...senao deve ser do tipo lógico",
-  "if_condition_type": "A condição $0 do comando se...senao deve ser do tipo lógico",
-  "invalid_return_type_full": "Erro na linha $0: a expressão não produz um tipo compatível com a função $1. Tipo esperado: $2.",
-  "invalid_return_type": "A expressão não produz um tipo compatível com a função $0. Tipo esperado: $1.",
-  "invalid_void_return_full": "Erro na linha $0: a função $1 não pode retornar uma expressão vazia, use uma espressão do tipo $2",
-  "invalid_void_return": "A função $0 não pode retornar uma expressão vazia, use uma espressão do tipo $1",
-  "unexpected_break_command_full": "Erro interno crítico: comando pare encontrado fora do contexto de um laço/escolha..caso na linha $0",
-  "unexpected_break_command": "Erro interno crítico: comando pare encontrado fora do contexto de um laço/escolha..caso",
-  "invalid_dimension": "As dimensões de um vetor/matriz devem ser do tipo inteiro",
-  "void_in_expression_full": "Erro na linha: $0, coluna: $1: a função $2 não pode ser utilizada em uma expressão pois seu tipo de retorno é vazio",
-  "void_in_expression": "A função $0 não pode ser utilizada em uma expressão pois seu tipo de retorno é vazio",
-  "invalid_array_access_full": "Identificador $0 na linha: $1, coluna: $2 não se refere a um vetor/matriz válido",
-  "invalid_array_access": "Identificador $0 não se refere a um vetor/matriz válido",
-  "invalid_matrix_access_full": "Identificador $0 na linha: $1, coluna: $2 não se refere a uma matriz válida",
-  "invalid_matrix_access": "Identificador $0 não se refere a uma matriz válida",
-  "matrix_column_outbounds_full": "Erro na linha $0: número de colunas $1 é inválido para a matriz $2 que possui $3 colunas",
-  "matrix_column_outbounds": "Número de colunas $0 é inválido para a matriz $1 que possui $2 colunas",
-  "matrix_line_outbounds_full": "Erro na linha $0: número de linhas $1 é inválido para a matriz $2 que possui $3 linhas",
-  "matrix_line_outbounds": "Número de linhas $0 é inválido para a matriz $1 que possui $2 linhas",
-  "vector_line_outbounds_full": "Erro na linha $0: número de linhas $1 é inválido para a matriz $2 que possui $3 linhas",
-  "vector_line_outbounds": "Número de linhas $0 é inválido para a matriz $1 que possui $2 linhas",
-  "vector_not_matrix_full": "Erro na linha $0: $1 não é uma matriz",
-  "vector_not_matrix": "$1 não é uma matriz",
-  "invalid_infix_op_full": "Erro na linha $0: não é possível aplicar a operação $1 entre os tipos $2 e $3",
-  "invalid_infix_op": "Não é possível aplicar a operação $0 entre os tipos $1 e $2",
-  "invalid_unary_op_full": "Erro na linha $0: não é possível aplicar a operação $1 ao tipo $2",
-  "invalid_unary_op": "Não é possível aplicar a operação $0 ao tipo $1",
-  "unknown_op": "Erro interno crítico: Operação $0 desconhecida",
-  "duplicate_function": "A função $0 na linha: $1, coluna: $2 já foi definida anteriormente.",
-  "duplicate_variable": "A variável $0 na linha: $1, coluna: $2 já foi declarada anteriormente.",
-  "main_parameters": "A função inicio não pode ter parâmetros.",
-  "symbol_not_found_full": "A variável $0 na linha: $1, coluna: $2 não foi declarada",
-  "symbol_not_found": "A variável $0 não foi declarada",
-  "array_dimension_not_int_full": "As dimensões de um vetor/matriz na linha: $0 devem ser do tipo inteiro.",
-  "array_dimension_not_int": "As dimensões de um vetor/matriz devem ser do tipo inteiro.",
-  "array_dimension_not_positive_full": "As dimensões de um vetor/matriz na linha: $0 devem ser valores positivos.",
-  "array_dimension_not_positive": "As dimensões de um vetor/matriz devem ser valores positivos.",
-  "incompatible_types_full": "O tipo $0 não é compatível com o tipo resultante da expressão na linha $1",
-  "incompatible_types": "O tipo $0 não é compatível com o tipo resultante da expressão fornecida.",
-  "incompatible_types_array_full": "A expressão $0 é incompatível com o tipo $1 na linha: $2, coluna: $3.",
-  "incompatible_types_array": "A expressão $0 é incompatível com o tipo $1.",
-  "invalid_case_type_full": "O caso $0 na linha $1 é incompatível com o tipo $2.",
-  "invalid_case_type": "O caso $0 é incompatível com o tipo $1.",
-  "function_no_return": "A função $0 não possui um retorno acessível. Toda função deve ter ao menos um retorno no seu corpo principal.",
-  "invalid_array_literal_type_full": "Erro na linha $0: a expressão $1 não resulta em um tipo compatível.",
-  "invalid_array_literal_type": "A expressão $0 não resulta em um tipo compatível.",
-  "invalid_array_literal_line_full": "Erro na linha $0: esperava-se $1 linhas mas encontrou $2.",
-  "invalid_array_literal_line": "Esperava-se $0 linhas mas encontrou $1.",
-  "invalid_array_literal_column_full": "Erro na linha $0: esperava-se $1 colunas mas encontrou $2.",
-  "invalid_array_literal_column": "Esperava-se $0 colunas mas encontrou $1.",
-  "exceeded_input_request": "A quantidade de leituras requisitadas execedeu a quantidade de entradas disponíveis.",
-  "test_case_few_reads": "Caso de teste $0 falhou: ainda restam entradas!",
-  "test_case_failed": "Caso de teste $0 falhou: entradas:<$1>; saída esperada:<$2>; saída:<$3>",
-  "test_case_failed_exception": "Caso de teste $0 falhou: $1"
-}

+ 0 - 9
i18n/es/index.js

@@ -1,9 +0,0 @@
-import errors from './error.json';
-import messages from './message.json'
-import ui from './ui.json';
-
-export default {
- 'message' : messages,
- 'error': errors,
- 'ui': ui
-}

+ 0 - 4
i18n/es/message.json

@@ -1,4 +0,0 @@
-{
-  "test_case_success": "Caso de teste $0: OK",
-  "test_case_duration": "Levou $0ms"
-}

+ 0 - 147
i18n/es/ui.json

@@ -1,147 +0,0 @@
-{
-  "function": "function",
-  "btn_clear": "Clear",
-  "btn_function": "Function",
-  "btn_arithmetic_plus": "Sum",
-  "btn_arithmetic_minus": "Minus",
-  "btn_arithmetic_multiplication": "Multiplication",
-  "btn_arithmetic_division": "Division",
-  "btn_arithmetic_module": "Module",
-  "btn_break":"Break",
-  "btn_case":"Case",
-  "start": "start",
-  "void": "void",
-  "integer": "integer",
-  "real": "real",
-  "program": "program",
-  "text": "string",
-  "text_start": "text",
-  "boolean": "boolean",
-  "true": "true",
-  "false": "false",
-  "variable": "Variable",
-  "command": "Command",
-  "new_parameter": "parameter",
-  "new_variable": "variable",
-  "new_global": "global",
-  "new_function": "new_function",
-  "matrix": "matrix",
-  "vector": "vector",
-  "text_comment_start": "Initial comment of function...",
-  "text_comment_main": "This is the main function...",
-  "text_read_var": "Reading data",
-  "text_write_var": "Writing data",
-  "text_command_read":"read",
-  "text_command_write":"write",
-  "text_comment": "Comment",
-  "text_attribution": "Attribution",
-  "text_if":"if",
-  "text_else":"else",
-  "text_break":"break",
-  "text_for":"for",
-  "text_code_while":"while",
-  "text_code_do":"do",
-  "text_command_do":"do",
-  "text_code_switch": "switch",
-  "text_code_case": "case",
-  "text_config_programming":"Programming",
-  "text_config_programming_both":"Visual and textual",
-  "text_config_programming_textual":"Textual",
-  "text_config_programming_visual":"Visual",
-  "text_logic_expression": "Logic Expression",
-  "text_arithmetic_expression": "Relational Expression",
-  "text_iftrue": "If true then",
-  "text_message_error_activity_file": "There was an error processing the activity. <br>Please reload the page and try again.",
-  "text_message_error_activity_reload": "Reload",
-  "text_receives": "receives",
-  "text_repeatNtimes": "Repeat N times",
-  "text_return":"return",
-  "text_btn_return":"Return",
-  "text_whiletrue": "While true",
-  "text_dowhiletrue": "Do while true",
-  "text_switch": "Switch",
-  "text_functioncall": "Function call",
-  "text_value": "Value",
-  "text_operator": "Operator",
-  "text_parentheses": "Parentheses",
-  "text_change": "Change",
-  "text_teacher_algorithm": "Algorithm",
-  "text_teacher_algorithm_include": "Include the following algorithm in exercise",
-  "text_teacher_test_case": "Test cases",
-  "text_teacher_config": "Settings",
-  "text_teacher_data_types": "Data types",
-  "text_teacher_commands": "Commands",
-  "text_teacher_functions": "Functions",
-  "text_teacher_create_functions": "Create new functions",
-  "text_teacher_create_movement_functions": "Move functions",
-  "text_teacher_test_case_input": "Input",
-  "text_teacher_test_case_output": "Output",
-  "text_teacher_test_case_actions": "Actions",
-  "text_teacher_test_case_add": "Add test cases",
-  "text_header_ivprog_functions": "iVProg Functions",
-  "text_menu_functions_math":"Mathematic",
-  "text_menu_functions_text":"Text",
-  "text_menu_functions_arrangement":"Arrangement",
-  "text_menu_functions_conversion":"Conversion",
-  "text_none_variable":"There is no declared variable",
-  "text_none_variable_instruction":"Create a new variable to use it",
-  "text_ivprog_description":"Interactive Visual Programming on the Internet",
-  "tooltip_visual": "Visual programming",
-  "tooltip_textual": "Textual programming",
-  "tooltip_upload": "Upload code file",
-  "tooltip_download": "Download code file",
-  "tooltip_undo": "Undo",
-  "tooltip_redo": "Redo",
-  "tooltip_run": "Run program",
-  "tooltip_evaluate": "Evaluate program",
-  "tooltip_help": "Help",
-  "tooltip_add_global": "Add global variable",
-  "tooltip_minimize": "Hidde function elements",
-  "tooltip_console": "Open/Close console",
-  "var_menu_select_var": "Select a var",
-  "var_menu_select_all": "Select",
-  "var_menu_select_function": "Select a function",
-  "expression_menu_select": "Construct any logical condition",
-  "math": "Mathematic",
-  "text_t": "Text",
-  "inform_valid_name": "Inform a valid name!",
-  "inform_valid_content": "Enter some content!",
-  "inform_valid_expression": "Construct the logical condition!",
-  "inform_valid_name_duplicated": "This name is already in use by other function.",
-  "inform_valid_global_duplicated": "A global variable with this name already exists.",
-  "inform_valid_variable_duplicated" : "A local variable with this name already exists.",
-  "arrangement": "Arrangement",
-  "conversion": "Conversion",
-  "$sin": "sin",
-  "$cos": "cos",
-  "$tan": "tan",
-  "$sqrt": "sqrt",
-  "$pow": "pow",
-  "$log": "log",
-  "$abs": "abs",
-  "$negate": "negate",
-  "$invert": "invert",
-  "$max": "maximum",
-  "$min": "minimum",
-  "$substring": "substring",
-  "$length": "length",
-  "$uppercase": "uppercase",
-  "$lowercase": "lowercase",
-  "$charAt": "char_at",
-  "$numElements": "total_of_elements",
-  "$matrixLines": "total_of_lines",
-  "$matrixColumns": "total_of_columns",
-  "$isReal": "is_real",
-  "$isInt": "is_integer",
-  "$isBool": "is_logic",
-  "$castReal": "to_real",
-  "$castInt": "to_integer",
-  "$castBool": "to_logic",
-  "$castString": "to_string",
-  "text_ivprog_version":"Version",
-  "text_teacher_filter": "Filter",
-  "text_teacher_filter_active": "Activate",
-  "text_teacher_filter_help": "When filter is activated, all iVProg modifications will be blocked.",
-  "text_teacher_generate_outputs": "Generate outputs",
-  "text_teacher_generate_outputs_algorithm": "Before generate outputs, create an algorithm!"
-}

+ 12 - 7
i18n/index.js

@@ -1,9 +1,14 @@
-import EN from './en';
-import PT from './pt';
-import ES from './es';
+import Messages from './message.csv';
+import UI from './ui.csv';
+import Errors from './error.csv'
 
-export default {
-  'en': EN,
-  'pt': PT,
-  'es': ES
+const i18n_data = {};
+for(const key in UI) {
+  const data = {};
+  data['error'] = Errors[key];
+  data['message'] = Messages[key];
+  data['ui'] = UI[key];
+  i18n_data[key] = data;
 }
+
+export default i18n_data;

+ 9 - 0
i18n/message.csv

@@ -0,0 +1,9 @@
+id,pt,en ,es
+test_case_success,"<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=""$1""><span>Caso de teste $0</span>: OK</div>","<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=""$1""><span>Test case $0</span>: OK</div>", 
+test_case_duration,Levou $0ms,Took $0ms, 
+test_suite_grade,A sua solução alcançou $0% da nota.,Your solution scored $0% of the grade., 
+awaiting_input_message,O seu programa está em execução e aguardando uma entrada! Digite algo e pressione ENTER...,Your program is running and awaiting for an input. Type something and press ENTER…, 
+assessment-empty-expected-tooltip,A saída gerada foi além do esperado,The generated output was beyond the amount expected, 
+assessment-empty-generated-tooltip,O programa não gerou saídas suficientes,The program did not generated enough outputs, 
+testcase_autogen_unused_input,O caso de teste $0 possui mais entradas do que as leituras feitas no programa.,The test case $0 has more inputs than output than the number of reads present in the algorithm., 
+testcase_autogen_empty,O caso de teste $0 não gerou qualquer saída.,The test case $0 did not generate any output., 

+ 0 - 132
i18n/pt/error.json

@@ -1,132 +0,0 @@
-{
-  "token_missing_one": "Erro de sintaxe: Espera-se $0, mas encontrou-se $1 na linha:$2, coluna:$3",
-  "token_missing_two": "Erro de sintaxe: Esperava-se $0 ou $1 mas encontrou-se $2 na liha:$3, coluna: $4",
-  "eos_missing": "Falta uma nova linha ou ; na linha: $0, coluna: $1",
-  "invalid_type": "$0 na linha: $1, coluna: $2 é um tipo inválido. Os tipos válidos são: $3",
-  "invalid_array_dimension": "A dimensão inválida na linha: $0, coluna: $1. Insira um $2 ou identificador válido do mesmo tipo.",
-  "invalid_array_size": "O tamnho do vetor/matriz excede o máximo de 2 na linha $0",
-  "extra_lines": "Nenhum texto é permitido após '}' em 'programa {...}'",
-  "invalid_main_return": "A função $0 deve retornar $1 na linha $2",
-  "invalid_var_declaration": "Erro na linha $0: variáveis só podem ser declaradas no corpo principal da função e nas primeiras linhas, antes de qualquer comando.",
-  "invalid_break_command": "Erro na linha $0. O comando $1 não pode ser usado fora de uma estrutura de repetição ou 'escolha...caso'",
-  "invalid_terminal": "Não é possível utilizar $0 na expressão da linha: $1, coluna: $2. Tente um valor númerico, variável ou chamada de função.",
-  "const_not_init": "Erro na linha: $0, coluna: $1. Uma variável declarada como const deve ser inicializada",
-  "id_missing": "Esperava-se um identificador, mas encontrou-se $0 na linha: $1, coluna: $2",
-  "invalid_id_format": "$0 na linha: $1, coluna: $2 não é um identificador válido. O símbolo '.' não é permitido neste contexto.",
-  "main_missing": "A função principal não foi encontrada",
-  "invalid_global_var": "Erro crítico: Chamada inválida da função initGlobal fora do contexto BASE",
-  "not_implemented": "Erro interno crítico: A função definida pelo sistema $0 não foi implementada.",
-  "function_missing": "A função $0 não foi encontrada",
-  "function_missing_full": "A função $0 na linha: $1, coluna: $2 não foi encontrada",
-  "invalid_parameters_size_full": "Erro na linha $0: a quantidade de parâmetros fornecidos à função $1 está incorreta. Esperava-se $2, encontrou-se $3.",
-  "invalid_parameters_size": "A quantidade de parâmetros fornecidos à função $0 está incorreta. Esperava-se $1, encontrou-se $2",
-  "invalid_ref_full": "A expressão $0 fornecida como parâmetro para a função $1 na linha $2 não é válida para esta função. Use uma variável ou posição de vetor.",
-  "invalid_ref": "A expressão $0 fornecida como parâmetro para a função $1 não é válida para esta função. Use uma variável ou posição de vetor.",
-  "invalid_parameter_type_full": "A expressão $0 fornecida como parâmetro para a função $1 na linha $2 não é compatível com o tipo esperado.",
-  "invalid_parameter_type": "A expressão $0 fornecida como parâmetro para a função $1 não é compatível com o tipo esperado.",
-  "unknown_command_full": "Erro interno crítico: comando desconhecido encontrado na linha $0",
-  "unknown_command": "Erro interno crítico: comando desconhecido encontrado!",
-  "loop_condition_type_full": "Erro na linha: $0, coluna $1: a condição $2 do laço de repetição deve ser do tipo lógico",
-  "loop_condition_type": "A condição $0 do laço de repetição deve ser do tipo lógico",
-  "endless_loop_full": "Possível laço infinito detectado no seu código. Verifique a linha $0",
-  "endless_loop": "Possível laço infinito detectado no seu código.",
-  "for_condition_type_full": "Erro na linha: $0, coluna $1: a condição de parada $2 do comando para(...) deve ser do tipo lógico",
-  "for_condition_type": "A condição de parada $0 do comando para(...) deve ser do tipo lógico",
-  "if_condition_type_full": "Erro na linha: $0, coluna $1: a condição $2 do comando se...senao deve ser do tipo lógico",
-  "if_condition_type": "A condição $0 do comando se...senao deve ser do tipo lógico",
-  "invalid_return_type_full": "Erro na linha $0: a expressão não produz um tipo compatível com a função $1. Tipo esperado: $2.",
-  "invalid_return_type": "A expressão não produz um tipo compatível com a função $0. Tipo esperado: $1.",
-  "invalid_void_return_full": "Erro na linha $0: a função $1 não pode retornar uma expressão vazia, use uma espressão do tipo $2",
-  "invalid_void_return": "A função $0 não pode retornar uma expressão vazia, use uma espressão do tipo $1",
-  "unexpected_break_command_full": "Erro interno crítico: comando pare encontrado fora do contexto de um laço/escolha..caso na linha $0",
-  "unexpected_break_command": "Erro interno crítico: comando pare encontrado fora do contexto de um laço/escolha..caso",
-  "invalid_dimension": "As dimensões de um vetor/matriz devem ser do tipo inteiro",
-  "void_in_expression_full": "Erro na linha: $0, coluna: $1: a função $2 não pode ser utilizada em uma expressão pois seu tipo de retorno é vazio",
-  "void_in_expression": "A função $0 não pode ser utilizada em uma expressão pois seu tipo de retorno é vazio",
-  "invalid_array_access_full": "Identificador $0 na linha: $1, coluna: $2 não se refere a um vetor/matriz válido",
-  "invalid_array_access": "Identificador $0 não se refere a um vetor/matriz válido",
-  "invalid_matrix_access_full": "Identificador $0 na linha: $1, coluna: $2 não se refere a uma matriz válida",
-  "invalid_matrix_access": "Identificador $0 não se refere a uma matriz válida",
-  "matrix_column_outbounds_full": "Erro na linha $0: número de colunas $1 é inválido para a matriz $2 que possui $3 colunas",
-  "matrix_column_outbounds": "Número de colunas $0 é inválido para a matriz $1 que possui $2 colunas",
-  "matrix_line_outbounds_full": "Erro na linha $0: número de linhas $1 é inválido para a matriz $2 que possui $3 linhas",
-  "matrix_line_outbounds": "Número de linhas $0 é inválido para a matriz $1 que possui $2 linhas",
-  "vector_line_outbounds_full": "Erro na linha $0: número de linhas $1 é inválido para a matriz $2 que possui $3 linhas",
-  "vector_line_outbounds": "Número de linhas $0 é inválido para a matriz $1 que possui $2 linhas",
-  "vector_not_matrix_full": "Erro na linha $0: $1 não é uma matriz",
-  "vector_not_matrix": "$1 não é uma matriz",
-  "invalid_infix_op_full": "Erro na linha $0: a expressão $1 é inválida, pois o operador $2 não pode ser aplicado aos tipos $3 e $4",
-  "invalid_infix_op": "A expressão $0 é inválida, pois o operador $1 não pode ser aplicado aos tipos $2 e $3",
-  "invalid_unary_op_full": "Erro na linha $0: a expressão $1 é inválida, pois o operador $2 não pode ser aplicado ao tipo $3",
-  "invalid_unary_op": "A expressão $0 é inválida, pois o operador $1 não pode ser aplicado ao tipo $2",
-  "unknown_op": "Erro interno crítico: Operação $0 desconhecida",
-  "duplicate_function": "A função $0 na linha: $1, coluna: $2 já foi definida anteriormente.",
-  "duplicate_variable": "A variável $0 na linha: $1, coluna: $2 já foi declarada anteriormente.",
-  "main_parameters": "A função inicio não pode ter parâmetros.",
-  "symbol_not_found_full": "A variável $0 na linha: $1, coluna: $2 não foi declarada",
-  "symbol_not_found": "A variável $0 não foi declarada",
-  "array_dimension_not_int_full": "As dimensões de um vetor/matriz na linha: $0 devem ser do tipo inteiro.",
-  "array_dimension_not_int": "As dimensões de um vetor/matriz devem ser do tipo inteiro.",
-  "array_dimension_not_positive_full": "As dimensões de um vetor/matriz na linha: $0 devem ser valores positivos.",
-  "array_dimension_not_positive": "As dimensões de um vetor/matriz devem ser valores positivos.",
-  "incompatible_types_full": "Era esperado um $0 mas a expressão $1 na linha $2 resulta em $3.",
-  "incompatible_types": "Era esperado um $0 mas a expressão $1 resulta em $2.",
-  "incompatible_types_array_full": "A expressão $0 é incompatível com o tipo $1 na linha: $2, coluna: $3.",
-  "incompatible_types_array": "A expressão $0 é incompatível com o tipo $1.",
-  "invalid_case_type_full": "O caso $0 na linha $1 é incompatível com o tipo $2.",
-  "invalid_case_type": "O caso $0 é incompatível com o tipo $1.",
-  "function_no_return": "A função $0 não possui um comando de devolução acessível. Toda função deve ter ao menos um comando 'devolva' no seu corpo principal.",
-  "invalid_array_literal_type_full": "Erro na linha $0: a expressão $1 não resulta em um tipo compatível.",
-  "invalid_array_literal_type": "A expressão $0 não resulta em um tipo compatível.",
-  "invalid_array_literal_line_full": "Erro na linha $0: esperava-se $1 linhas mas encontrou $2.",
-  "invalid_array_literal_line": "Esperava-se $0 linhas mas encontrou $1.",
-  "invalid_array_literal_column_full": "Erro na linha $0: esperava-se $1 colunas mas encontrou $2.",
-  "invalid_array_literal_column": "Esperava-se $0 colunas mas encontrou $1.",
-  "exceeded_input_request": "A quantidade de leituras requisitadas execedeu a quantidade de entradas disponíveis.",
-  "test_case_few_reads": "Caso de teste $0 falhou: ainda restam entradas!",
-  "test_case_failed": "<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=\"$1\"> <span>Caso de teste $0 não executou com sucesso.</span></div>",
-  "test_case_failed_exception": "<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=\"$2\"> <span>Caso de teste $0 falhou</span>: $1",
-  "test_case_exception": "Ocorreu uma exceção no caso de teste $0: $1",
-  "invalid_type_conversion": "O valor $0 não pode ser convertido para o tipo $1",
-  "invalid_read_type":"Erro na linha $0: A entrada \"$1\" não é do tipo $2, que é o tipo da variável <span class='ivprog-error-varname'>$3</span>.",
-  "invalid_read_type_array":"Erro na linha $0: A entrada \"$1\" não é do tipo $2, que é o tipo aceito pela variável <span class='ivprog-error-varname'>$3</span> que é um $4.",
-  "inform_valid_identifier": "Informe um nome válido! O nome não pode ser uma palavra reservadoa e deve começar com letras e conter apenas letras, números e _",
-  "inform_valid_global_duplicated": "Já existe uma variável global com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.",
-  "inform_valid_variable_duplicated" : "Já existe uma variável com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos.",
-  "inform_valid_function_duplicated" : "Já existe uma função com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.",
-  "inform_valid_param_duplicated" : "Já existe um parâmetro com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos.",
-  "invalid_character": "O caractere $0 na linha $1 não pode ser utilizado neste contexto.",
-  "annonymous_array_literal": "Erro na linha $0: a notação de vetor/matriz só permitida durante a inicialização de uma variável desse tipo. Ex: inteiro vec[3] ← {1,2,3}.",
-  "invalid_matrix_literal_line": "A expressão $0 na linha $1 não possui um número de elementos igual a linha anterior. Todas as linhas de uma matriz devem ter a mesma quantidade de elementos.",
-  "cannot_infer_matrix_line": "Não é possível inferir o número de linhas da matriz $0 na linha $1. É necessário que ela seja inicializada ou que o valor seja informado de forma explícita.",
-  "cannot_infer_matrix_column": "Não é possível inferir o número de colunas da matriz $0 na linha $1. É necessário que ela seja inicializada ou que o valor seja informado de forma explícita.",
-  "cannot_infer_vector_size": "Não é possível inferir o número de elementos do vetor $0 na linha $1. É necessário que ele seja inicializado ou que o valor seja informado de forma explícita",
-  "matrix_to_vector_literal_attr":  "Erro na linha $0: A expressão $1 representa uma matriz e não pode ser atribuída ao vetor $2.",
-  "vector_to_matrix_literal_attr":  "Erro na linha $0: A expressão $1 representa um vetor e não pode ser atribuído a matriz $2.",
-  "invalid_const_ref_full": "A variável $0 fornecida como parâmetro para a função $1 na linha $2 é uma constante e não pode ser usada neste contexto. Use uma variável ou posição de vetor.",
-  "invalid_const_ref": "A variável $0 fornecida como parâmetro para a função $1 é uma constante e não pode ser usada neste contexto. Use uma variável ou posição de vetor.",
-  "invalid_const_assignment_full": "Erro na linha $0: $1 é uma constante e portanto não pode ter seu valor alterado",
-  "invalid_const_assignment": "$0 é uma constante e portanto não pode ter seu valor alterado",
-  "array_init_not_literal": "Erro na linha $0: Vetor/Matriz só pode ser inicializado por literal. Ex: real vetor[] <- {1,2,3}",
-  "array_exceeds_2d": "Erro na linha $0: O número máximo de dimensões que um arranjo pode ter é 2. Elemento de 3 ou mais dimensões encontrado!",
-  "invalid_matrix_id_dimension": "Erro na linha $0: Você deve definir todas as dimensões da matriz quando uma delas é definida por uma variável! Ex: real mat1[var][5], mat2[5][var]",
-  "invalid_vector_init": "Erro na linha $0: Não se pode inicializar um vetor que teve seu tamanho declarado utilizando uma variável! Utilize uma atribuição de vetores ou use um laço de repetição.",
-  "invalid_matrix_init": "Erro na linha $0: Não se pode inicializar uma matrix que teve ao menos uma das suas dimensões declaradas utilizando uma variável! Utilize uma atribuição de matrizes ou use um laço de repetição.",
-  "invalid_vector_assignment_full": "Erro na linha $0: Só se pode atribuir um vetor a outro desde que eles comportem o mesmo número de elementos. $1 comporta $2 e $3 comporta $4!",
-  "invalid_vector_assignment": "Só se pode atribuir um vetor a outro desde que eles comportem o mesmo número de elementos. $0 comporta $1 e $2 comporta $3!",
-  "invalid_matrix_assignment_full": "Erro na linha $0: Só se pode atribuir uma matriz a outra desde que ambas possuam dimensões de mesmo tamanho. $1 tem $2 linhas e $3 colunas, enquanto $4 possui $5 linhas e $6 colunas!",
-  "invalid_matrix_assignment": "Só se pode atribuir uma matriz a outra desde que ambas possuam dimensões de mesmo tamanho. $0 tem $1 linhas e $2 colunas, enquanto $3 possui $4 linhas e $5 colunas!",
-  "matrix_to_vector_attr":  "Erro na linha $0: $1 representa uma matriz e não pode ser atribuída ao vetor $2.",
-  "vector_to_matrix_attr":  "Erro na linha $0: $1 representa um vetor e não pode ser atribuído a matriz $2.",
-  "invalid_matrix_index_assign_full": "Erro na linha $0: A posição $1 da matriz $2 aceita apenas vetores de tamanho $3, mas $4 tem tamanho $5",
-  "invalid_matrix_index_assign": "A linha $0 da matriz $1 aceita apenas vetores de tamanho $2, mas $3 tem tamanho $4",
-  "invalid_number_elements_vector": "Esperava-se por $0 elementos na linha $1 mas a expressão $2 possui $3 elementos.",
-  "invalid_number_lines_matrix": "Esperava-se por uma matriz com $0 linhas na linha $1 mas a expressão $2 possui $3 linhas",
-  "divsion_by_zero_full": "Erro na linha $0: A expressão $1 resulta em uma divisão por 0.",
-  "divsion_by_zero": "A expressão $0 resulta em uma divisão por 0.",
-  "undefined_tanget_value": "Erro na linha $0: A tangente de $1° não é indefinida.",
-  "negative_log_value": "Erro na linha $0: Não se pode calcular o log de um valor negativo.",
-  "invalid_string_index": "Erro na linha $0 durante a execução da função $1: $2 é um índice inválido para a cadeia de texto $3. Os valores válidos vão de 0 à $4",
-  "negative_sqrt_value": "Erro na linha $0: Não é permitido calcular a raiz quadrada de um número negativo.",
-  "exceeded_recursive_calls": "Erro na execução da linha $0: Número de chamadas recursivas execedeu o limite máximo definido!"
-}

+ 0 - 9
i18n/pt/index.js

@@ -1,9 +0,0 @@
-import errors from './error.json';
-import messages from './message.json'
-import ui from './ui.json';
-
-export default {
- 'message' : messages,
- 'error': errors,
- 'ui': ui
-}

+ 0 - 10
i18n/pt/message.json

@@ -1,10 +0,0 @@
-{
-  "test_case_success": "<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=\"$1\"><span>Caso de teste $0</span>: OK</div>",
-  "test_case_duration": "Levou $0ms",
-  "test_suite_grade": "A sua solução alcançou $0% da nota.",
-  "awaiting_input_message": "O seu programa está em execução e aguardando uma entrada! Digite algo e pressione ENTER...",
-  "assessment-empty-expected-tooltip": "A saída gerada foi além do esperado",
-  "assessment-empty-generated-tooltip": "O programa não gerou saídas suficientes",
-  "testcase_autogen_unused_input": "O caso de teste $0 possui mais entradas do que as leituras feitas no programa.",
-  "testcase_autogen_empty": "O caso de teste $0 não gerou qualquer saída."
-}

+ 0 - 130
i18n/pt/ui.json

@@ -1,130 +0,0 @@
-{
-  "function": "funcao",
-  "btn_clear": "Limpar",
-  "btn_function": "Função",
-  "btn_arithmetic_plus": "Adição",
-  "btn_arithmetic_minus": "Subtração",
-  "btn_arithmetic_multiplication": "Multiplicação",
-  "btn_arithmetic_division": "Divisão",
-  "btn_arithmetic_module": "Módulo",
-  "btn_break":"Pare",
-  "btn_case":"Caso",
-  "start": "inicio",
-  "type_void": "vazio",
-  "type_integer": "inteiro",
-  "logic_operator_and": "E",
-  "logic_operator_or": "OU",
-  "logic_operator_not": "nao",
-  "type_real": "real",
-  "program": "programa",
-  "type_text": "cadeia",
-  "textvar_default_value": "texto",
-  "type_boolean": "logico",
-  "logic_value_true": "verdadeiro",
-  "logic_value_false": "falso",
-  "variable": "Variável",
-  "command": "Comando",
-  "new_parameter": "parametro",
-  "new_variable": "variavel",
-  "new_global": "global",
-  "new_function": "nova_funcao",
-  "matrix": "matriz",
-  "vector": "vetor",
-  "text_comment_start": "Comentário inicial da função...",
-  "text_comment_main": "Esta é a função principal...",
-  "text_read_var": "Entrada de dados",
-  "text_write_var": "Saída de dados",
-  "text_command_read":"entrada",
-  "text_command_write":"saida",
-  "text_return":"retorne",
-  "text_btn_return":"Retorno",
-  "text_comment": "Comentário",
-  "string_join_or": "ou",
-  "matrix_info_string": "matriz de $0",
-  "vector_info_string": "vetor de $0",
-  "text_attribution": "Atribuição",
-  "text_if":"se",
-  "text_break":"pare",
-  "text_else":"senao",
-  "text_for":"para",
-  "text_code_while":"enquanto",
-  "text_code_do":"faca",
-  "text_command_do":"faça",
-  "text_code_switch": "escolha",
-  "text_code_case": "caso",
-  "text_config_programming":"Programação",
-  "text_config_programming_both":"Visual e textual",
-  "text_config_programming_textual":"Textual",
-  "text_config_programming_visual":"Visual",
-  "text_logic_expression": "Expressão Lógica",
-  "text_arithmetic_expression": "Expressão Relacional",
-  "text_iftrue": "Se verdadeiro então",
-  "text_message_error_activity_file": "Aconteceu um erro ao processar a atividade. <br> Recarregue a página para tentar novamente.",
-  "text_message_error_activity_reload": "Recarregar",
-  "text_repeatNtimes": "Repita N vezes",
-  "text_receives": "recebe",
-  "text_whiletrue": "Enquanto verdadeiro",
-  "text_dowhiletrue": "Faça enquanto verdadeiro",
-  "text_switch": "Escolha",
-  "text_functioncall": "Chamada de função",
-  "text_value": "Valor",
-  "text_operator": "Operador",
-  "text_parentheses": "Parênteses",
-  "text_change": "Alterar",
-  "text_teacher_algorithm": "Algoritmo",
-  "text_teacher_algorithm_include": "Incluir o algoritmo abaixo no exercício",
-  "text_teacher_test_case": "Casos de teste",
-  "text_teacher_config": "Configurações",
-  "text_teacher_data_types": "Tipos de dados",
-  "text_teacher_commands": "Comandos",
-  "text_teacher_functions": "Funções",
-  "text_teacher_create_functions": "Criar novas funções",
-  "text_teacher_create_movement_functions": "Movimentar funções",
-  "text_teacher_test_case_input": "Entrada",
-  "text_teacher_test_case_output": "Saída",
-  "text_teacher_test_case_actions": "Ações",
-  "text_teacher_test_case_add": "Adicionar caso de teste",
-  "text_header_ivprog_functions": "Funções do iVProg",
-  "text_menu_functions_math":"Matemática",
-  "text_menu_functions_text":"Texto",
-  "text_menu_functions_array":"Arranjo",
-  "text_menu_functions_conversion":"Conversão",
-  "text_no_variable":"Nenhuma variável declarada",
-  "text_no_variable_instruction":"Antes de utilizar uma variável, é necessário criá-la",
-  "text_ivprog_description":"Programação Visual interativa na Internet",
-  "tooltip_visual": "Programação visual",
-  "tooltip_textual": "Programação textual",
-  "tooltip_upload": "Upload de código fonte",
-  "tooltip_download": "Download do código fonte",
-  "tooltip_undo": "Desfazer",
-  "tooltip_redo": "Refazer",
-  "tooltip_run": "Executar o programa",
-  "tooltip_evaluate": "Avaliar o programa",
-  "tooltip_help": "Ajuda",
-  "tooltip_add_global": "Adicionar variável global",
-  "tooltip_hide_function": "Ocultar os elementos da função",
-  "var_menu_select_var": "Selecione uma variável",
-  "var_menu_select_all": "Selecione",
-  "var_menu_select_function": "Selecione uma função",
-  "expression_menu_select": "Construir uma expressão lógica",
-  "inform_valid_content": "Informe o conteúdo!",
-  "inform_valid_expression": "Construa uma expressão lógica!",
-  "tooltip_terminal_clear":"Limpa o terminal removendo todos os textos",
-  "tooltip_terminal_show":"Exibe o terminal caso esteja escondido",
-  "tooltip_terminal_hide":"Esconde o terminal caso não esteja escondido",
-  "text_ivprog_version":"Versão",
-  "text_teacher_filter": "Filtro",
-  "text_teacher_filter_active": "Ativado",
-  "text_teacher_filter_help": "Ao ativar o filtro, as modificações do iVProg estarão bloqueadas.",
-  "text_join_assessment_outputs": " ; ",
-  "assessment-detail-time-label": "Duração",
-  "assessment-detail-grade-label": "Nota",
-  "assessment-detail-input-label": "Entradas",
-  "assessment-detail-output-label": "Saídas",
-  "assessment-detail-expected-label": "Esperava",
-  "assessment-detail-generated-label": "Gerou",
-  "assessment-detail-result-label": "Resultado",
-  "assessment-detail-title": "Caso de Teste $0",
-  "text_teacher_generate_outputs": "Gerar saídas",
-  "text_teacher_generate_outputs_algorithm": "Antes de gerar as saídas, elabore um algoritmo!"
-}

+ 132 - 0
i18n/ui.csv

@@ -0,0 +1,132 @@
+id,pt,en ,es
+function,funcao,function,funccion
+btn_clear,Limpar,Clean,
+btn_function,Função,Function,
+btn_arithmetic_plus,Adição,Addition,
+btn_arithmetic_minus,Subtração,Subtraction,
+btn_arithmetic_multiplication,Multiplicação,Multiplication,
+btn_arithmetic_division,Divisão,Division,
+btn_arithmetic_module,Módulo,Remainder,
+btn_break,Pare,break,
+btn_case,Caso,Case,
+start,inicio,main,
+type_void,vazio,void,
+type_integer,inteiro,int,
+logic_operator_and,E,AND,
+logic_operator_or,OU,OR,
+logic_operator_not,nao,not,
+type_real,real,real,
+program,programa,program,
+type_text,cadeia,string,
+textvar_default_value,texto,text,
+type_boolean,logico,bool,
+logic_value_true,1,1,
+logic_value_false,0,0,
+variable,Variável,Variable,
+command,Comando,Command,
+new_parameter,parametro,parameter,
+new_variable,variavel,variable,
+new_global,global,global,
+new_function,nova_funcao,new_function,
+matrix,matriz,matrix,
+vector,vetor,vector,
+text_comment_start,Comentário inicial da função...,Function initial comment,
+text_comment_main,Esta é a função principal...,This is the main funcion,
+text_read_var,Entrada/Leitura de dados,Input/Read data,
+text_write_var,Saída/Escrita de dados,Output/Write data,
+text_command_read,leia,read,
+text_command_write,escreva,write,
+text_return,devolva,return,
+text_btn_return,Devolver,Return,
+text_comment,Comentário,Comment,
+string_join_or,ou,or,
+matrix_info_string,matriz de $0,matrix of $0,
+vector_info_string,vetor de $0,vector of $0,
+text_attribution,Atribuição,Assignment,
+text_if,se,if,
+text_break,pare,break,
+text_else,senao,eles,
+text_for,repita_para,repeat_for,
+text_code_while,repita_enquanto,repeat_while,
+text_code_do,repita,repeat,
+text_code_do_until,ate_que,until,
+text_command_do,repita,repeat,
+text_command_while,repita enquanto,repeat while,
+text_command_do_until,até que,until,
+text_code_switch,escolha,switch,
+text_code_case,caso,case,
+text_config_programming,Programação,Programming,
+text_config_programming_both,Visual e textual,Visual & Textual,
+text_config_programming_textual,Textual,Textual,
+text_config_programming_visual,Visual,Visual,
+text_logic_expression,Expressão Lógica,Logic Expression,
+text_arithmetic_expression,Expressão Relacional,Relational Expression,
+text_iftrue,Se verdadeiro então,If true then,
+text_message_error_activity_file,Aconteceu um erro ao processar a atividade. <br> Recarregue a página para tentar novamente.,There was an error processing the activity.<br> Reload the page to try again.,
+text_message_error_activity_reload,Recarregar,Reload,
+text_repeatNtimes,Repita N vezes,Repeat N times,
+text_receives,recebe,receives,
+text_whiletrue,Enquanto verdadeiro,While true,
+text_dowhiletrue,Repita até que verdadeiro,Repeat until true,
+text_switch,Escolha,Switch,
+text_functioncall,Chamada de função,Function call,
+text_value,Valor,Value,
+text_operator,Operador,Operator,
+text_parentheses,Parênteses,Parentheses,
+text_change,Alterar,Modify,
+text_teacher_algorithm,Algoritmo,Algorithm,
+text_teacher_algorithm_include,Incluir o algoritmo abaixo no exercício,Include the algorithm below in the activity,
+text_teacher_test_case,Casos de teste,Test cases,
+text_teacher_config,Configurações,Configurations,
+text_teacher_data_types,Tipos de dados,Data types,
+text_teacher_commands,Comandos,Commands,
+text_teacher_functions,Funções,Functions,
+text_teacher_create_functions,Criar novas funções,Create new functions,
+text_teacher_create_movement_functions,Movimentar funções,Move functions,
+text_teacher_test_case_input,Entrada,Input,
+text_teacher_test_case_output,Saída,Output,
+text_teacher_test_case_actions,Ações,Actions,
+text_teacher_test_case_add,Adicionar caso de teste,Add test case,
+text_header_ivprog_functions,Funções do iVProg,iVProg Functions,
+text_menu_functions_math,Matemática,Math,
+text_menu_functions_text,Texto,Text,
+text_menu_functions_array,Arranjo,Array,
+text_menu_functions_conversion,Conversão,Conversion,
+text_no_variable,Nenhuma variável declarada,No variable declared,
+text_no_variable_instruction,"Antes de utilizar uma variável, é necessário criá-la","Before using a variable, you need to create it",
+text_ivprog_description,Programação Visual interativa na Internet,Interactive and Visual Programming on the Internet,
+tooltip_visual,Programação visual,Visual programming,
+tooltip_textual,Programação textual,Textual programming,
+tooltip_upload,Upload de código fonte,Upload source code,
+tooltip_download,Download do código fonte,Download source code,
+tooltip_undo,Desfazer,Undo,
+tooltip_redo,Refazer,Redo,
+tooltip_run,Executar o programa,Run the program,
+tooltip_evaluate,Avaliar o programa,Evaluate the program,
+tooltip_help,Ajuda,Help,
+tooltip_add_global,Adicionar variável global,Add a global variable,
+tooltip_hide_function,Ocultar os elementos da função,Hide function elements,
+var_menu_select_var,Selecione uma variável,Select a variable,
+var_menu_select_all,Selecione,Select,
+var_menu_select_function,Selecione uma função,Select a function,
+expression_menu_select,Construir uma expressão lógica,Construct a logic expression,
+inform_valid_content,Informe o conteúdo!,Provide some data,
+inform_valid_expression,Construa uma expressão lógica!,Construct a logic expression,
+tooltip_terminal_clear,Limpa o terminal removendo todos os textos,Clears the terminal by removing all text,
+tooltip_terminal_show,Exibe o terminal caso esteja escondido,Shows the terminal if it is hidden,
+tooltip_terminal_hide,Esconde o terminal caso não esteja escondido,Hides the terminal if it is not on display,
+text_ivprog_version,Versão,Version,
+text_teacher_filter,Filtro,Filter,
+text_teacher_filter_active,Ativado,Activated,
+text_teacher_filter_help,"Ao ativar o filtro, as modificações do iVProg estarão bloqueadas.",By activating the filter modifications in iVProg will be blocked,
+text_join_assessment_outputs, ; ,;,
+assessment-detail-time-label,Duração,Duration,
+assessment-detail-grade-label,Nota,Grade,
+assessment-detail-input-label,Entradas,Inputs,
+assessment-detail-output-label,Saídas,Outputs,
+assessment-detail-expected-label,Esperava,Expected,
+assessment-detail-generated-label,Gerou,Generated,
+assessment-detail-result-label,Resultado,Result,
+assessment-detail-title,Caso de Teste $0,Test Case $0,
+text_teacher_generate_outputs,Gerar saídas,Generate outputs,
+text_teacher_generate_outputs_algorithm,"Antes de gerar as saídas, elabore um algoritmo!",Before generating the outputs you need to create an algorithm,

+ 34 - 0
i18n_csv_loader.js

@@ -0,0 +1,34 @@
+const Readable = require("stream").Readable;
+const csv = require("csv-parser");
+
+function createStream (text) {
+  const stream = new Readable();
+  stream.push(text);
+  stream.push(null);
+  return stream;
+}
+
+module.exports = function (csv_data) {
+  const callback = this.async();
+  let csv_headers = [];
+  const file_data = []
+  const stream = createStream(csv_data);
+  stream.pipe(csv())
+  .on('error', error => callback(error))
+  .on('headers', headers => csv_headers = headers)
+  .on('data', data => file_data.push(data))
+  .on('end', () => {
+    const id = csv_headers[0];
+    const messages = {};
+    for(let i = 1; i < csv_headers.length; i += 1) {
+      const lang = csv_headers[i];
+      const strings = {};
+      file_data.forEach( data => {
+        strings[data[id]] = data[lang];
+      });
+      messages[lang] = strings;
+    }
+    callback(null, `module.exports = ${JSON.stringify(messages)}`);
+  })
+}
+

+ 5 - 4
js/ast/commands/for.js

@@ -2,11 +2,12 @@ import { Command } from './command';
 
 export class For extends Command {
 
-  constructor (assignment, condition, increment, commandBlock) {
+  constructor (for_id, for_from, for_to, for_pass, commandBlock) {
     super();
-    this.assignment = assignment;
-    this.condition = condition;
-    this.increment = increment;
+    this.for_id = for_id;
+    this.for_from = for_from;
+    this.for_to = for_to;
+    this.for_pass = for_pass;
     this.commandBlock = commandBlock;
   }
 

+ 2 - 2
js/ast/commands/index.js

@@ -9,7 +9,7 @@ import { For } from './for';
 import { Function } from './function';
 import { IfThenElse } from './ifThenElse';
 import { CommandBlock } from './commandBlock';
-import { DoWhile } from './doWhile';
+import { RepeatUntil } from './repeatUntil';
 import { Switch } from './switch';
 import { Case } from './case';
 import { SysCall } from './sysCall';
@@ -28,7 +28,7 @@ export {
   Function,
   IfThenElse,
   CommandBlock,
-  DoWhile,
+  RepeatUntil,
   Switch,
   Case,
   SysCall,

+ 1 - 1
js/ast/commands/doWhile.js

@@ -1,6 +1,6 @@
 import { While } from './while';
 
-export class DoWhile extends While {
+export class RepeatUntil extends While {
 
   constructor(condition, commandBlock) {
     super(condition, commandBlock);

+ 58 - 37
js/ast/ivprogParser.js

@@ -781,9 +781,9 @@ export class IVProgParser {
       return this.parseIDCommand();
     } else if (token.type === this.lexerClass.RK_RETURN) {
       return this.parseReturn();
-    } else if (token.type === this.lexerClass.RK_WHILE) {
+    } else if (token.type === this.lexerClass.RK_WHILE || token.type === this.lexerClass.RK_WHILE_ALT) {
       return this.parseWhile();
-    } else if (token.type === this.lexerClass.RK_FOR) {
+    } else if (token.type === this.lexerClass.RK_FOR || token.type === this.lexerClass.RK_FOR_ALT) {
       return this.parseFor();
     } else if (token.type === this.lexerClass.RK_BREAK ) {
       if(!this.insideScope(IVProgParser.BREAKABLE)) {
@@ -796,7 +796,7 @@ export class IVProgParser {
     } else if (token.type === this.lexerClass.RK_SWITCH) {
       return this.parseSwitchCase();
     } else if (token.type === this.lexerClass.RK_DO) {
-      return this.parseDoWhile();
+      return this.parseRepeatUntil();
     } else if (token.type === this.lexerClass.RK_IF) {
       return this.parseIfThenElse();
     } else if (this.checkEOS(true)){
@@ -831,15 +831,15 @@ export class IVProgParser {
     return new Commands.Switch(exp, casesList);
   }
 
-  parseDoWhile () {
+  parseRepeatUntil () {
     this.pos++;
     this.consumeNewLines();
     this.pushScope(IVProgParser.BREAKABLE);
     const commandsBlock = this.parseCommandBlock();
     this.consumeNewLines(); //Maybe not...
     const whileToken = this.getToken();
-    if (whileToken.type !== this.lexerClass.RK_WHILE) {
-      throw SyntaxErrorFactory.token_missing_one(this.lexer.literalNames[this.lexerClass.RK_WHILE], whileToken);
+    if (whileToken.type !== this.lexerClass.RK_DO_UNTIL) {
+      throw SyntaxErrorFactory.token_missing_one(this.lexer.literalNames[this.lexerClass.RK_DO_UNTIL], whileToken);
     }
     this.pos++;
     this.checkOpenParenthesis();
@@ -851,7 +851,7 @@ export class IVProgParser {
     this.pos++;
     this.checkEOS();
     this.popScope();
-    return new Commands.DoWhile(condition, commandsBlock);
+    return new Commands.RepeatUntil(condition, commandsBlock);
   }
 
   parseIfThenElse () {
@@ -899,21 +899,23 @@ export class IVProgParser {
 
   parseFor () {
     this.pushScope(IVProgParser.BREAKABLE);
-    this.pos++;
-    this.checkOpenParenthesis();
-    this.pos++;
-    this.consumeNewLines();
-    const attribution = this.parseForAssign();
-    this.consumeNewLines();
-    const condition = this.parseExpressionOR();
-    this.consumeForSemiColon();
-    const increment = this.parseForAssign(true);
-    this.checkCloseParenthesis()
-    this.pos++;
+    const for_token = this.getToken();
+    this.pos += 1;
+    // parse ID
+    const id_token = this.getToken();
+    const id = this.parseID();
+    const for_id = new Expressions.VariableLiteral(id);
+    for_id.sourceInfo = SourceInfo.createSourceInfo(id_token);
+    // END parse ID
+    const for_from = this.parseForParameters(this.lexerClass.RK_FOR_FROM);
+    const for_to = this.parseForParameters(this.lexerClass.RK_FOR_TO);
+    const maybePass = this.parseForParameters(this.lexerClass.RK_FOR_PASS);
     this.consumeNewLines();
     const commandsBlock = this.parseCommandBlock();
     this.popScope();
-    return new Commands.For(attribution, condition, increment, commandsBlock);
+    const cmd = new Commands.For(for_id, for_from, for_to, maybePass, commandsBlock);
+    cmd.sourceInfo = SourceInfo.createSourceInfo(for_token);
+    return cmd;
   }
 
   parseWhile () {
@@ -1007,26 +1009,45 @@ export class IVProgParser {
     }
   }
 
-  parseForAssign (isLast = false) {
-    if(!isLast)
-      this.consumeNewLines();
-    if(this.checkEOS(true)) {
-      return null;
+  parseForParameters (keyword_code) {
+    if(keyword_code === this.lexerClass.RK_FOR_PASS) {
+      if(this.checkOpenCurly(true)) {
+        return null;
+      }
     }
-    const id = this.parseID();
-    const equal = this.getToken();
-    if (equal.type !== this.lexerClass.EQUAL) {
-      throw SyntaxErrorFactory.token_missing_one('=', equal);
+    const from_token = this.getToken();
+    if (from_token.type !== keyword_code) {
+      // TODO better error message
+      const keyword = this.lexer.literalNames[keyword_code];
+      throw new Error("Error de sintaxe no comando repita_para: esperava-se "+keyword+" mas encontrou "+from_token.text);
     }
-    this.pos++
-    const exp = this.parseExpressionOR();
-    if(!isLast) {
-      this.consumeForSemiColon();
+    this.pos += 1;
+    let int_or_id = this.getToken();
+    let is_unary_op = false;
+    let op = null;
+    if(int_or_id.type === this.lexerClass.SUM_OP) {
+      is_unary_op = true;
+      op = int_or_id.text;
+      this.pos += 1;
+      int_or_id = this.getToken();
     }
-    const sourceInfo = SourceInfo.createSourceInfo(equal);
-    const cmd = new Commands.Assign(id, exp);
-    cmd.sourceInfo = sourceInfo;
-    return cmd;
+    let for_from = null;
+    if (int_or_id.type === this.lexerClass.ID) {
+      for_from = new Expressions.VariableLiteral(this.parseID());
+      for_from.sourceInfo = SourceInfo.createSourceInfo(int_or_id);
+    } else if (int_or_id.type === this.lexerClass.INTEGER) {
+      this.pos += 1;
+      for_from = this.getIntLiteral(int_or_id);
+    }
+    if (for_from == null) {
+      // TODO better error message
+      const keyword = this.lexer.literalNames[keyword_code];      
+      throw new Error("Error de sintaxe no comando repeita_para: "+ int_or_id.text + " não é compativel com o esperado para o paramentro "+ keyword + ". O valor deve ser um inteiro ou variável.");
+    }
+    if (is_unary_op) {
+      for_from = new Expressions.UnaryApp(convertFromString(op), for_from);
+    }
+    return for_from;
   }
 
   parseCases () {
@@ -1326,4 +1347,4 @@ export class IVProgParser {
     const types = this.insideScope(IVProgParser.FUNCTION) ? this.functionTypes : this.variableTypes;
     return types.map( x => this.lexer.literalNames[x]);
   }
-}
+}

+ 40 - 14
js/processor/ivprogProcessor.js

@@ -8,7 +8,7 @@ import { resultTypeAfterInfixOp, resultTypeAfterUnaryOp } from './compatibilityT
 import * as Commands from './../ast/commands/';
 import * as Expressions from './../ast/expressions/';
 import { ArrayType } from './../typeSystem/array_type';
-import { convertToString } from '../typeSystem/parsers';
+import { convertToString, toInt } from '../typeSystem/parsers';
 import { Config } from '../util/config';
 import { ProcessorErrorFactory } from './error/processorErrorFactory';
 import { RuntimeError } from './error/runtimeError';
@@ -113,6 +113,9 @@ export class IVProgProcessor {
 
   findFunction (name) {
     if(name.match(/^\$.+$/)) {
+      if(name === IVProgProcessor.MAIN_INTERNAL_ID) {
+        return this.findMainFunction();
+      }
       const fun = LanguageDefinedFunction.getFunction(name);
       if(!fun) {
         throw ProcessorErrorFactory.not_implemented(name);
@@ -238,8 +241,8 @@ export class IVProgProcessor {
       return this.executeReturn(store, cmd);
     } else if (cmd instanceof Commands.IfThenElse) {
       return this.executeIfThenElse(store, cmd);
-    } else if (cmd instanceof Commands.DoWhile) {
-      return this.executeDoWhile(store, cmd);
+    } else if (cmd instanceof Commands.RepeatUntil) {
+      return this.executeRepeatUntil(store, cmd);
     } else if (cmd instanceof Commands.While) {
       return this.executeWhile(store, cmd);
     } else if (cmd instanceof Commands.For) {
@@ -319,12 +322,36 @@ export class IVProgProcessor {
     });
   }
 
+  /**
+   * 
+   * @param {Store} store 
+   * @param {Commands.For} cmd 
+   */
   executeFor (store, cmd) {
-    try {
-      //BEGIN for -> while rewrite
-      const initCmd = cmd.assignment;
-      const condition = cmd.condition;
-      const increment = cmd.increment;
+    //BEGIN for -> while rewrite
+    const initCmd = new Commands.Assign(cmd.for_id.id, cmd.for_from);
+    initCmd.sourceInfo = cmd.sourceInfo;
+    const is_forward_exp = new Expressions.InfixApp(Operators.GE, cmd.for_to, cmd.for_from);
+    return this.evaluateExpression(store, is_forward_exp).then (result => {
+      const is_forward = result.value;
+      let condition = null;
+      if (is_forward) {
+        condition = new Expressions.InfixApp(Operators.LE, cmd.for_id, cmd.for_to);
+      } else {
+        condition = new Expressions.InfixApp(Operators.GE, cmd.for_id, cmd.for_to);
+      }
+      condition.sourceInfo = cmd.sourceInfo;
+      let pass_value = cmd.for_pass;
+      if(pass_value == null) {
+        if(is_forward) {
+          pass_value = new Expressions.IntLiteral(toInt(1));
+        } else {
+          pass_value = new Expressions.IntLiteral(toInt(-1));
+        }
+      }
+      const increment = new Commands.Assign(cmd.for_id.id,
+        new Expressions.InfixApp(Operators.ADD, cmd.for_id, pass_value));
+        increment.sourceInfo = cmd.sourceInfo;
       const whileBlock = new Commands.CommandBlock([],
         cmd.commands.concat(increment));
       const forAsWhile = new Commands.While(condition, whileBlock);
@@ -332,12 +359,10 @@ export class IVProgProcessor {
       //END for -> while rewrite
       const newCmdList = [initCmd,forAsWhile];
       return this.executeCommands(store, newCmdList);
-    } catch (error) {
-      return Promise.reject(error);
-    }
+    }).catch(error => Promise.reject(error));
   }
 
-  executeDoWhile (store, cmd) {
+  executeRepeatUntil (store, cmd) {
     try {
       this.loopTimers.push(Date.now());
       this.context.push(Context.BREAKABLE);
@@ -354,7 +379,7 @@ export class IVProgProcessor {
           if (!vl.type.isCompatible(Types.BOOLEAN)) {
             return Promise.reject(ProcessorErrorFactory.loop_condition_type_full(cmd.sourceInfo));
           }
-          if (vl.get()) {
+          if (!vl.get()) {
             this.context.pop();
             if(this.loopTimers.length > 0) {
               const time = this.loopTimers[0];
@@ -445,7 +470,8 @@ export class IVProgProcessor {
     try {
       const funcName = store.name === IVProgProcessor.MAIN_INTERNAL_ID ? 
         LanguageDefinedFunction.getMainFunctionName() : store.name;
-      const func = this.findFunction(funcName);
+      console.log(funcName,  store.name === IVProgProcessor.MAIN_INTERNAL_ID);
+      const func = this.findFunction(store.name);
       const funcType = func.returnType;
       const $value = this.evaluateExpression(store, cmd.expression);
       

+ 22 - 5
js/processor/semantic/semanticAnalyser.js

@@ -330,12 +330,29 @@ export class SemanticAnalyser {
       this.checkCommands(type, cmd.commands, optional);
       return false;
     } else if (cmd instanceof For) {
-      this.checkCommand(type, cmd.assignment, optional);
-      const resultType = this.evaluateExpressionType(cmd.condition);
-      if (!resultType.isCompatible(Types.BOOLEAN)) {
-        throw ProcessorErrorFactory.for_condition_type_full(cmd.condition.toString(), cmd.sourceInfo);
+      console.log(cmd);
+      const var_type = this.evaluateExpressionType(cmd.for_id);
+      if (!var_type.isCompatible(Types.INTEGER)) {
+        // TODO better error message
+        throw new Error("A variavel do comando repita_para deve ser do tipo inteiro");
+      }
+      const from_type = this.evaluateExpressionType(cmd.for_from);
+      if (!from_type.isCompatible(Types.INTEGER)) {
+        // TODO better error message
+        throw new Error("o paramentro 'de' do comando repita_para deve ser do tipo inteiro");
+      }
+      const to_type = this.evaluateExpressionType(cmd.for_to);
+      if (!to_type.isCompatible(Types.INTEGER)) {
+        // TODO better error message
+        throw new Error("o paramentro 'ate' do comando repita_para deve ser do tipo inteiro");
+      }
+      if (cmd.for_pass != null) {
+        const pass_type = this.evaluateExpressionType(cmd.for_pass);
+        if (!pass_type.isCompatible(Types.INTEGER)) {
+          // TODO better error message
+          throw new Error("o paramentro 'passo' do comando repita_para deve ser do tipo inteiro");
+        }
       }
-      this.checkCommand(type, cmd.increment, optional);
       this.checkCommands(type, cmd.commands, optional);
       return false;
     } else if (cmd instanceof Switch) {

+ 67 - 59
js/util/editorMode2.js

@@ -1,5 +1,11 @@
 import { getCodeEditorModeConfig } from "./utils";
 
+/**
+ * Source: https://raw.githubusercontent.com/codemirror/CodeMirror/master/mode/clike/clike.js
+ * @author arijn Haverbeke and others
+ * @author Lucas de Souza
+ * @param {CodeMirror} CodeMirror 
+ */
 export function CodeEditorMode (CodeMirror) {
   "use strict";
 
@@ -11,14 +17,16 @@ export function CodeEditorMode (CodeMirror) {
     this.align = align;
     this.prev = prev;
   }
+
   function pushContext(state, col, type, info) {
-    var indent = state.indented;
+    let indent = state.indented;
     if (state.context && state.context.type == "statement" && type != "statement")
       indent = state.context.indented;
     return state.context = new Context(indent, col, type, info, null, state.context);
   }
+  
   function popContext(state) {
-    var t = state.context.type;
+    const t = state.context.type;
     if (t == ")" || t == "]" || t == "}")
       state.indented = state.context.indented;
     return state.context = state.context.prev;
@@ -38,15 +46,35 @@ export function CodeEditorMode (CodeMirror) {
     }
   }
 
+  function contains(words, word) {
+    if (typeof words === "function") {
+      return words(word);
+    } else {
+      return Object.propertyIsEnumerable.call(words, word);
+    }
+  }
+
+  function tokenComment(stream, state) {
+    let maybeEnd = false, ch;
+    while ((ch = stream.next())) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = null;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return "comment";
+  }
+
   CodeMirror.defineMode("ivprog", function (config, parserConfig) {
-    var indentUnit = config.indentUnit,
+    const indentUnit = config.indentUnit,
       statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
       dontAlignCalls = parserConfig.dontAlignCalls,
       keywords = parserConfig.keywords || {},
       switchKeyword = parserConfig.switchKeyword,
       caseKeyword = parserConfig.caseKeyword,
       defaultKeyword = parserConfig.defaultKeyword,
-      caseRegex = new RegExp(`^\s*(?:${caseKeyword} .*?:|${defaultKeyword}:|\{\}?|\})$`),////,
+      caseRegex = new RegExp(`^\\s*(?:${caseKeyword} .*?:|${defaultKeyword}:|\\{\\}?|\\})$`),////,
       types = parserConfig.types || {},
       builtin = parserConfig.builtin || {},
       blockKeywords = parserConfig.blockKeywords || {},
@@ -56,21 +84,21 @@ export function CodeEditorMode (CodeMirror) {
       multiLineStrings = parserConfig.multiLineStrings,
       indentStatements = false,
       namespaceSeparator = null,
-      isPunctuationChar = /[\[\]{}\(\),;\:\n]/,
-      numberStart = /[\d\.]/,
-      number = /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)/i,
-      isOperatorChar = /[+\-*%=<>!\/]/,
+      isPunctuationChar = /[[\]{}(),;:\n]/,
+      numberStart = /[\d.]/,
+      number = /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)$/i,
+      isOperatorChar = /[+\-*%=<>!/&]/,
       isIdentifierChar = /[a-zA-Z0-9_]/,
       // An optional function that takes a {string} token and returns true if it
       // should be treated as a builtin.
       isReservedIdentifier = parserConfig.isReservedIdentifier || false;
 
-    var curPunc, isDefKeyword;
-
+    let curPunc, isDefKeyword;
+    let tokenString = function () { /*SKIP*/};
     function tokenBase(stream, state) {
-      var ch = stream.next();
+      const ch = stream.next();
       if (hooks[ch]) {
-        var result = hooks[ch](stream, state);
+        const result = hooks[ch](stream, state);
         if (result !== false) return result;
       }
       if (ch == '"') {
@@ -97,14 +125,14 @@ export function CodeEditorMode (CodeMirror) {
         }
       }
       if (isOperatorChar.test(ch)) {
-        while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) { }
+        while (!stream.match(/^\/[/*]/, false) && stream.eat(isOperatorChar)) { /* SKIP */}
         return "operator";
       }
       stream.eatWhile(isIdentifierChar);
       if (namespaceSeparator) while (stream.match(namespaceSeparator))
         stream.eatWhile(isIdentifierChar);
 
-      var cur = stream.current();
+      const cur = stream.current();
       if (contains(keywords, cur)) {
         if (contains(blockKeywords, cur)) curPunc = "newstatement";
         if (contains(defKeywords, cur)) isDefKeyword = true;
@@ -120,9 +148,9 @@ export function CodeEditorMode (CodeMirror) {
       return "variable";
     }
 
-    function tokenString(quote) {
+     tokenString = function (quote) {
       return function (stream, state) {
-        var escaped = false, next, end = false;
+        let escaped = false, next, end = false;
         while ((next = stream.next()) != null) {
           if (next == quote && !escaped) { end = true; break; }
           escaped = !escaped && next == "\\";
@@ -133,18 +161,6 @@ export function CodeEditorMode (CodeMirror) {
       };
     }
 
-    function tokenComment(stream, state) {
-      var maybeEnd = false, ch;
-      while (ch = stream.next()) {
-        if (ch == "/" && maybeEnd) {
-          state.tokenize = null;
-          break;
-        }
-        maybeEnd = (ch == "*");
-      }
-      return "comment";
-    }
-
     function maybeEOL(stream, state) {
       if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))
         state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)
@@ -164,7 +180,7 @@ export function CodeEditorMode (CodeMirror) {
       },
 
       token: function (stream, state) {
-        var ctx = state.context;
+        let ctx = state.context;
         if (stream.sol()) {
           if (ctx.align == null) ctx.align = false;
           state.indented = stream.indentation();
@@ -172,7 +188,7 @@ export function CodeEditorMode (CodeMirror) {
         }
         if (stream.eatSpace()) { maybeEOL(stream, state); return null; }
         curPunc = isDefKeyword = null;
-        var style = (state.tokenize || tokenBase)(stream, state);
+        let style = (state.tokenize || tokenBase)(stream, state);
         if (style == "comment" || style == "meta") return style;
         if (ctx.align == null) ctx.align = true;
 
@@ -200,7 +216,7 @@ export function CodeEditorMode (CodeMirror) {
           style = "def";
 
         if (hooks.token) {
-          var result = hooks.token(stream, state, style);
+          const result = hooks.token(stream, state, style);
           if (result !== undefined) style = result;
         }
 
@@ -214,17 +230,18 @@ export function CodeEditorMode (CodeMirror) {
 
       indent: function (state, textAfter) {
         if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;
-        var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
-        var closing = firstChar == ctx.type;
+        let ctx = state.context;
+        const firstChar = textAfter && textAfter.charAt(0)
+        const closing = firstChar == ctx.type;
         if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
         if (parserConfig.dontIndentStatements)
           while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info))
             ctx = ctx.prev
         if (hooks.indent) {
-          var hook = hooks.indent(state, ctx, textAfter, indentUnit);
+          const hook = hooks.indent(state, ctx, textAfter, indentUnit);
           if (typeof hook == "number") return hook
         }
-        var switchBlock = ctx.prev && ctx.prev.info == switchKeyword;
+        const switchBlock = ctx.prev && ctx.prev.info == switchKeyword;
         if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {
           while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev
           return ctx.indented
@@ -235,7 +252,7 @@ export function CodeEditorMode (CodeMirror) {
           return ctx.column + (closing ? 0 : 1);
         if (ctx.type == ")" && !closing)
           return ctx.indented + statementIndentUnit;
-        var caseTestRegex = new RegExp(`^(?:${caseKeyword}|${defaultKeyword})\b`)
+        const caseTestRegex = new RegExp(`^(?:${caseKeyword}|${defaultKeyword})\b`)
         return ctx.indented + (closing ? 0 : indentUnit) +
           (!closing && switchBlock && !caseTestRegex.test(textAfter) ? indentUnit : 0);
       },
@@ -250,42 +267,33 @@ export function CodeEditorMode (CodeMirror) {
   });
 
   function words(str) {
-    var obj = {}, words = str.split(" ");
-    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+    const obj = {}, words = str.split(" ");
+    for (let i = 0; i < words.length; ++i) obj[words[i]] = true;
     return obj;
   }
-  function contains(words, word) {
-    if (typeof words === "function") {
-      return words(word);
-    } else {
-      return words.propertyIsEnumerable(word);
-    }
-  }
+  
   const codeConfig = getCodeEditorModeConfig();
 
-  var ivprogKeywords =  codeConfig.keywords.join(" ");
+  const ivprogKeywords =  codeConfig.keywords.join(" ");
 
-  // Do not use this. Use the cTypes function below. This is global just to avoid
-  // excessive calls when cTypes is being called multiple times during a parse.
-  var basicTypes = words(codeConfig.types.join(" "));
+  const basicTypes = words(codeConfig.types.join(" "));
 
-  // Returns true if identifier is a "C" type.
-  // C type is defined as those that are reserved by the compiler (basicTypes),
-  // and those that end in _t (Reserved by POSIX for types)
-  // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html
   function ivprogTypes(identifier) {
     return contains(basicTypes, identifier);
   }
 
-  var ivprogBlockKeywords = codeConfig.blocks.join(" ");
-  var ivprogDefKeywords = "funcao const";
+  const ivprogBlockKeywords = codeConfig.blocks.join(" ");
+  const ivprogDefKeywords = "funcao const";
 
   function def(mimes, mode) {
     if (typeof mimes == "string") mimes = [mimes];
-    var words = [];
+    const words = [];
     function add(obj) {
-      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))
-        words.push(prop);
+      if (obj) {
+        for (const prop in obj) if (Object.hasOwnProperty.call(obj, prop)) {
+          words.push(prop);
+        }
+      }
     }
     add(mode.keywords);
     add(mode.types);
@@ -296,7 +304,7 @@ export function CodeEditorMode (CodeMirror) {
       CodeMirror.registerHelper("hintWords", mimes[0], words);
     }
 
-    for (var i = 0; i < mimes.length; ++i)
+    for (let i = 0; i < mimes.length; ++i)
       CodeMirror.defineMIME(mimes[i], mode);
   }
   

+ 30 - 28
js/util/utils.js

@@ -97,33 +97,9 @@ export function isElementInViewport (el) {
     rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
     rect.top < (window.innerHeight || document.documentElement.clientHeight);
 }
+
 let cacheMainList = null;
 let cacheOp = null;
-export function isKeyword (text) {
-  fillCache();
-  for (let key = 0; key < cacheMainList.length; ++key) {
-    const keyword = cacheMainList[key];
-    if(keyword == text) {
-      return true;
-    }
-  }
-  // not in main list, check op
-  for (let op = 0; op < cacheOp.length; op++) {
-    const lOp = cacheOp[op];
-    if(lOp == text) {
-      return true;
-    }
-  }
-  return false;
-}
-
-export function isValidIdentifier (identifier_str) {
-  const validRegex = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
-  if(!validRegex) {
-    return false;
-  }
-	return !isKeyword(identifier_str);
-}
 
 function fillCache () {
   if(cacheMainList == null) {
@@ -150,10 +126,36 @@ function fillCache () {
   }
 }
 
+export function isKeyword (text) {
+  fillCache();
+  for (let key = 0; key < cacheMainList.length; ++key) {
+    const keyword = cacheMainList[key];
+    if(keyword == text) {
+      return true;
+    }
+  }
+  // not in main list, check op
+  for (let op = 0; op < cacheOp.length; op++) {
+    const lOp = cacheOp[op];
+    if(lOp == text) {
+      return true;
+    }
+  }
+  return false;
+}
+
+export function isValidIdentifier (identifier_str) {
+  const validRegex = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
+  if(!validRegex) {
+    return false;
+  }
+	return !isKeyword(identifier_str);
+}
+
 export function getCodeEditorModeConfig () {
-  const blockList = ["RK_SWITCH", "RK_PROGRAM","RK_CASE","RK_DEFAULT","RK_FOR",
-    "RK_FUNCTION","RK_DO","RK_WHILE","RK_IF","RK_ELSE"]
-  const keywordsList = ["RK_CONST","RK_RETURN","RK_BREAK"];
+  const blockList = ["RK_SWITCH", "RK_PROGRAM","RK_CASE","RK_DEFAULT","RK_FOR","RK_FOR_ALT",
+    "RK_FUNCTION","RK_DO","RK_WHILE","RK_WHILE_ALT","RK_IF","RK_ELSE"]
+  const keywordsList = ["RK_CONST","RK_RETURN","RK_BREAK","RK_FOR_FROM","RK_FOR_TO","RK_FOR_PASS","RK_DO_UNTIL"];
   const typeList = ["RK_REAL","RK_VOID","RK_BOOLEAN","RK_STRING","RK_INTEGER"];
   const atomList = ["RK_FALSE", "RK_TRUE"];
 

+ 19 - 18
js/visualUI/code_generator.js

@@ -237,32 +237,33 @@ function repeatNtimesCode (command_obj, indentation) {
 		ret += '\t';
 	}
 
-	ret += LocalizedStrings.getUI('text_for') + ' ( ';
+	ret += LocalizedStrings.getUI('text_for') + ' ';
 
 	if (command_obj.var_attribution) {
 		ret += variableValueMenuCode(command_obj.var_attribution);
-		ret += ' <- ';
+		ret += ' de ';
 		ret += variableValueMenuCode(command_obj.expression1);
 	}
-	ret += ' ; ';
-
 
 	if (command_obj.expression2) {
-		/*switch (command_obj.expression2.expression.type) {
-			case Models.EXPRESSION_TYPES.exp_logic:
-				ret += logicExpressionCode(command_obj.expression2.expression);
+		ret += ' ate ';
+		ret += variableValueMenuCode(command_obj.expression2);
+	}
+
+	if (command_obj.expression3) {
+		ret += ' passo ';
+		switch (command_obj.expression3.itens[1]) {
+			case Models.ARITHMETIC_TYPES.plus:
+				ret += ' +';
 				break;
-			case Models.EXPRESSION_TYPES.exp_arithmetic:
-				ret += arithmeticExpressionCode(command_obj.expression2.expression);
+			case Models.ARITHMETIC_TYPES.minus:
+				ret += ' -';
 				break;
-		}*/
-
-		ret += elementExpressionCode(command_obj.expression2);
+		}
+		ret += variableValueMenuCode(command_obj.expression3.itens[2]);
 	}
 
-	ret += ' ; ';
-
-	if (command_obj.var_incrementation) {
+	/*if (command_obj.var_incrementation) {
 		ret += variableValueMenuCode(command_obj.var_incrementation);
 		ret += ' <- ';
 		ret += variableValueMenuCode(command_obj.expression3.itens[0]);
@@ -286,9 +287,9 @@ function repeatNtimesCode (command_obj, indentation) {
 		}
 
 		ret += variableValueMenuCode(command_obj.expression3.itens[2]);		
-	}
+	}*/
 
-	ret += ' )  { ';
+	ret += ' { ';
 
 	if (command_obj.commands_block) {
 		for (var i = 0; i < command_obj.commands_block.length; i++) {
@@ -383,7 +384,7 @@ function doWhilesCode (command_obj, indentation) {
 		ret += '\t';
 	}
 
-	ret += '} ' + LocalizedStrings.getUI('text_code_while');
+	ret += '} ' + LocalizedStrings.getUI('text_code_do_until');
 
 	if (!command_obj.expression) {
 		Utils.renderErrorMessage(command_obj.expression.dom_object, LocalizedStrings.getUI('inform_valid_expression'));

+ 3 - 3
js/visualUI/commands.js

@@ -473,17 +473,17 @@ export function genericCreateCommand (command_type) {
 		case Models.COMMAND_TYPES.attribution:
 			return new Models.Attribution(new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.only_variable, null, null, null, false), 
 				[]);
-
+ 
 		case Models.COMMAND_TYPES.functioncall:
 			return new Models.FunctionCall(new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.only_function, null, null, null, false), null);
 
 		case Models.COMMAND_TYPES.iftrue:
 			return new Models.IfTrue([new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true)]);
-
+//(var_attribution, var_incrementation, expression1, expression2, expression3, commands_block)
 		case Models.COMMAND_TYPES.repeatNtimes:
 			return new Models.RepeatNTimes(new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.only_variable, null, null, null, false), 
 											new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.only_variable, null, null, null, false),
-										     null, [new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true)], null, null);
+										     null, new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true), null, null);
 
 		case Models.COMMAND_TYPES.whiletrue:
 			return new Models.WhileTrue([new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true)], null);

+ 2 - 2
js/visualUI/commands/dowhiletrue.js

@@ -5,7 +5,7 @@ import * as ContextualizedMenu from './contextualized_menu';
 import * as GenericExpressionManagement from './generic_expression';
 
 export function createFloatingCommand () {
-	return $('<div class="ui dowhiletrue created_element"> <i class="ui icon small sync"></i> <span> '+ LocalizedStrings.getUI('text_command_do') +' <br> ' + LocalizedStrings.getUI('text_code_while') +'(x < 10) </span></div>');
+	return $('<div class="ui dowhiletrue created_element"> <i class="ui icon small sync"></i> <span> '+ LocalizedStrings.getUI('text_command_do') +' <br> ' + LocalizedStrings.getUI('text_command_do_until') +'(x < 10) </span></div>');
 }
 
 export function renderCommand (command, function_obj) {
@@ -13,7 +13,7 @@ export function renderCommand (command, function_obj) {
 	ret += '<div class="ui dowhiletrue command_container"> <i class="ui icon small sync command_drag"></i> <i class="ui icon times red button_remove_command"></i> <div class="ui context_menu"></div>  <span class="span_command_spec"> ' + LocalizedStrings.getUI('text_command_do') + ' </span>';
 	ret += '<div class="ui block_commands" data-subblock="" data-idcommand="">';
 	ret += '</div>';
-	ret += ' <span class="span_command_spec"> ' + LocalizedStrings.getUI('text_code_while') + ' </span> <span class="span_command_spec"> ( </span> <div class="conditional_expression"></div> <span class="span_command_spec"> ) </span>';
+	ret += ' <span class="span_command_spec"> ' + LocalizedStrings.getUI('text_command_do_until') + ' </span> <span class="span_command_spec"> ( </span> <div class="conditional_expression"></div> <span class="span_command_spec"> ) </span>';
 	ret += '</div>';
 
 	var el = $(ret);

File diff suppressed because it is too large
+ 46 - 28
js/visualUI/commands/repeatNtimes.js


+ 2 - 2
js/visualUI/commands/whiletrue.js

@@ -5,12 +5,12 @@ import * as ContextualizedMenu from './contextualized_menu';
 import * as GenericExpressionManagement from './generic_expression';
 
 export function createFloatingCommand () {
-	return $('<div class="ui whiletrue created_element"> <i class="ui icon small sync"></i> <span> ' + LocalizedStrings.getUI('text_code_while') + ' ( x < 10 ) <br> </span></div>');
+	return $('<div class="ui whiletrue created_element"> <i class="ui icon small sync"></i> <span> ' + LocalizedStrings.getUI('text_command_while') + ' ( x < 10 ) <br> </span></div>');
 }
 
 export function renderCommand (command, function_obj) {
 	var ret = '';
-	ret += '<div class="ui whiletrue command_container"> <i class="ui icon small sync command_drag"></i> <i class="ui icon times red button_remove_command"></i> <div class="ui context_menu"></div>  <span class="span_command_spec"> ' + LocalizedStrings.getUI('text_code_while') + ' </span>';
+	ret += '<div class="ui whiletrue command_container"> <i class="ui icon small sync command_drag"></i> <i class="ui icon times red button_remove_command"></i> <div class="ui context_menu"></div>  <span class="span_command_spec"> ' + LocalizedStrings.getUI('text_command_while') + ' </span>';
 	ret += '<span class="span_command_spec"> ( </span> <div class="conditional_expression"></div> <span class="span_command_spec"> ) </span>';
 	ret += ' </span>';
 	ret += '<div class="ui block_commands">';

+ 72 - 5
package-lock.json

@@ -1775,7 +1775,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
       "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-      "dev": true,
       "requires": {
         "buffer-alloc-unsafe": "^1.1.0",
         "buffer-fill": "^1.0.0"
@@ -1784,14 +1783,12 @@
     "buffer-alloc-unsafe": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-      "dev": true
+      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
     },
     "buffer-fill": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
-      "dev": true
+      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
     },
     "buffer-from": {
       "version": "1.1.1",
@@ -2513,6 +2510,27 @@
         }
       }
     },
+    "csv-parser": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-2.3.0.tgz",
+      "integrity": "sha512-yfYRZ9P9LNKuRK0lEFf40Be4HcFxe1XgxWL/QmlkakSE8SHcWbOGFZA/u7YpfGX/hVbRUdbnO5xO8XuYxrcBtA==",
+      "requires": {
+        "buffer-alloc": "^1.1.0",
+        "buffer-from": "^1.0.0",
+        "execa": "^1.0.0",
+        "generate-function": "^1.0.1",
+        "generate-object-property": "^1.0.0",
+        "minimist": "^1.2.0",
+        "ndjson": "^1.4.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+        }
+      }
+    },
     "currently-unhandled": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
@@ -4380,6 +4398,19 @@
       "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
       "dev": true
     },
+    "generate-function": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-1.1.0.tgz",
+      "integrity": "sha1-VMIbCAGSsW2Yd3ecW7gWZudyNl8="
+    },
+    "generate-object-property": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+      "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+      "requires": {
+        "is-property": "^1.0.0"
+      }
+    },
     "get-caller-file": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
@@ -5196,6 +5227,11 @@
       "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
       "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
     },
+    "is-property": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+      "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
+    },
     "is-regex": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
@@ -5323,6 +5359,11 @@
       "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
       "dev": true
     },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+    },
     "json5": {
       "version": "0.5.1",
       "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
@@ -5942,6 +5983,24 @@
       "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
       "dev": true
     },
+    "ndjson": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz",
+      "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=",
+      "requires": {
+        "json-stringify-safe": "^5.0.1",
+        "minimist": "^1.2.0",
+        "split2": "^2.1.0",
+        "through2": "^2.0.3"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+        }
+      }
+    },
     "negotiator": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
@@ -7710,6 +7769,14 @@
         "extend-shallow": "^3.0.0"
       }
     },
+    "split2": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
+      "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
+      "requires": {
+        "through2": "^2.0.2"
+      }
+    },
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",

+ 2 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "ivprog",
-  "version": "4.3.2",
+  "version": "4.4.0",
   "description": "IMA para o ensino de programação",
   "main": "js/main.js",
   "scripts": {
@@ -51,6 +51,7 @@
   "dependencies": {
     "antlr4": "^4.7.2",
     "codemirror": "^5.48.0",
+    "csv-parser": "^2.3.0",
     "decimal.js": "^10.1.1",
     "line-i18n": "git+http://200.144.254.107/git/LInE/line-i18n.git",
     "melanke-watchjs": "^1.5.0",

+ 16 - 6
webpack.config.js

@@ -1,9 +1,10 @@
-var path = require('path');
-var HtmlWebpackPlugin = require('html-webpack-plugin');
-var UpdateVersionPlugin = require('./updateVersionPlugin');
-//var ChangeScriptSourcePlugin = require('./changeScriptSourcePlugin');
-var CopyPlugin = require('copy-webpack-plugin');
-var CleanWebpackPlugin = require('clean-webpack-plugin');
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const UpdateVersionPlugin = require('./updateVersionPlugin');
+//const ChangeScriptSourcePlugin = require('./changeScriptSourcePlugin');
+const CopyPlugin = require('copy-webpack-plugin');
+const CleanWebpackPlugin = require('clean-webpack-plugin');
+const CSVLoader = require("./i18n_csv_loader");
 
 module.exports = {
     entry: path.resolve(__dirname, 'js/main.js'),
@@ -39,6 +40,15 @@ module.exports = {
               test: /\.tsx?$/,
               use: 'ts-loader',
               exclude: /node_modules/
+            },
+            {
+              test: /\.csv$/,
+              use: [
+                {
+                  loader: path.resolve(__dirname, 'i18n_csv_loader')
+                }
+              ],
+              exclude: /node_modules/
             }
         ]
     },