diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index 85b2c5f09b..331a3af30d 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -365,6 +365,7 @@ 'PlPgsqlLexer': ('pygments.lexers.sql', 'PL/pgSQL', ('plpgsql',), (), ('text/x-plpgsql',)), 'PointlessLexer': ('pygments.lexers.pointless', 'Pointless', ('pointless',), ('*.ptls',), ()), 'PonyLexer': ('pygments.lexers.pony', 'Pony', ('pony',), ('*.pony',), ()), + 'PortugolLexer': ('pygments.lexers.pascal', 'Portugol', ('portugol',), ('*.alg', '*.portugol'), ()), 'PostScriptLexer': ('pygments.lexers.graphics', 'PostScript', ('postscript', 'postscr'), ('*.ps', '*.eps'), ('application/postscript',)), 'PostgresConsoleLexer': ('pygments.lexers.sql', 'PostgreSQL console (psql)', ('psql', 'postgresql-console', 'postgres-console'), (), ('text/x-postgresql-psql',)), 'PostgresLexer': ('pygments.lexers.sql', 'PostgreSQL SQL dialect', ('postgresql', 'postgres'), (), ('text/x-postgresql',)), diff --git a/pygments/lexers/compiled.py b/pygments/lexers/compiled.py index 40493af4f8..eaf6fd3919 100644 --- a/pygments/lexers/compiled.py +++ b/pygments/lexers/compiled.py @@ -16,7 +16,7 @@ from pygments.lexers.go import GoLexer from pygments.lexers.rust import RustLexer from pygments.lexers.c_like import ECLexer, ValaLexer, CudaLexer -from pygments.lexers.pascal import DelphiLexer, Modula2Lexer +from pygments.lexers.pascal import DelphiLexer, PortugolLexer, Modula2Lexer from pygments.lexers.ada import AdaLexer from pygments.lexers.business import CobolLexer, CobolFreeformatLexer from pygments.lexers.fortran import FortranLexer diff --git a/pygments/lexers/pascal.py b/pygments/lexers/pascal.py index d238a71fc4..c88a0aeca1 100644 --- a/pygments/lexers/pascal.py +++ b/pygments/lexers/pascal.py @@ -19,7 +19,21 @@ # compatibility import from pygments.lexers.modula2 import Modula2Lexer -__all__ = ['DelphiLexer'] +__all__ = ['DelphiLexer', 'PortugolLexer'] + + +class PortugolLexer(Lexer): + name = 'Portugol' + aliases = ['portugol'] + filenames = ['*.alg', '*.portugol'] + mimetypes = [] + + def __init__(self, **options): + Lexer.__init__(self, **options) + self.lexer = DelphiLexer(**options, portugol=True) + + def get_tokens_unprocessed(self, text): + return self.lexer.get_tokens_unprocessed(text) class DelphiLexer(Lexer): @@ -296,18 +310,109 @@ class DelphiLexer(Lexer): 'xlatb', 'xor' } + PORTUGOL_KEYWORDS = ( + 'aleatorio', + 'algoritmo', + 'arquivo', + 'ate', + 'caso', + 'cronometro', + 'debug', + 'e', + 'eco', + 'enquanto', + 'entao', + 'escolha', + 'escreva', + 'escreval', + 'faca', + 'falso', + 'fimalgoritmo', + 'fimenquanto', + 'fimescolha', + 'fimfuncao', + 'fimpara', + 'fimprocedimento', + 'fimrepita', + 'fimse', + 'funcao', + 'inicio', + 'int', + 'interrompa', + 'leia', + 'limpatela', + 'mod', + 'nao', + 'ou', + 'outrocaso', + 'para', + 'passo', + 'pausa', + 'procedimento', + 'repita', + 'retorne', + 'se', + 'senao', + 'timer', + 'var', + 'vetor', + 'verdadeiro', + 'xou', + 'div', + 'mod', + 'abs', + 'arccos', + 'arcsen', + 'arctan', + 'cos', + 'cotan', + 'Exp', + 'grauprad', + 'int', + 'log', + 'logn', + 'pi', + 'quad', + 'radpgrau', + 'raizq', + 'rand', + 'randi', + 'sen', + 'Tan', + 'asc', + 'carac', + 'caracpnum', + 'compr', + 'copia', + 'maiusc', + 'minusc', + 'numpcarac', + 'pos', + ) + + PORTUGOL_BUILTIN_TYPES = { + 'inteiro', 'real', 'caractere', 'logico' + } + def __init__(self, **options): Lexer.__init__(self, **options) self.keywords = set() - if get_bool_opt(options, 'turbopascal', True): - self.keywords.update(self.TURBO_PASCAL_KEYWORDS) - if get_bool_opt(options, 'delphi', True): - self.keywords.update(self.DELPHI_KEYWORDS) - if get_bool_opt(options, 'freepascal', True): - self.keywords.update(self.FREE_PASCAL_KEYWORDS) self.builtins = set() - for unit in get_list_opt(options, 'units', list(self.BUILTIN_UNITS)): - self.builtins.update(self.BUILTIN_UNITS[unit]) + if get_bool_opt(options, 'portugol', False): + self.keywords.update(self.PORTUGOL_KEYWORDS) + self.builtins.update(self.PORTUGOL_BUILTIN_TYPES) + self.is_portugol = True + else: + self.is_portugol = False + + if get_bool_opt(options, 'turbopascal', True): + self.keywords.update(self.TURBO_PASCAL_KEYWORDS) + if get_bool_opt(options, 'delphi', True): + self.keywords.update(self.DELPHI_KEYWORDS) + if get_bool_opt(options, 'freepascal', True): + self.keywords.update(self.FREE_PASCAL_KEYWORDS) + for unit in get_list_opt(options, 'units', list(self.BUILTIN_UNITS)): + self.builtins.update(self.BUILTIN_UNITS[unit]) def get_tokens_unprocessed(self, text): scanner = Scanner(text, re.DOTALL | re.MULTILINE | re.IGNORECASE) @@ -327,14 +432,16 @@ def get_tokens_unprocessed(self, text): if stack[-1] == 'initial': if scanner.scan(r'\s+'): token = Whitespace - elif scanner.scan(r'\{.*?\}|\(\*.*?\*\)'): + elif not self.is_portugol and scanner.scan(r'\{.*?\}|\(\*.*?\*\)'): if scanner.match.startswith('$'): token = Comment.Preproc else: token = Comment.Multiline elif scanner.scan(r'//.*?$'): token = Comment.Single - elif scanner.scan(r'[-+*\/=<>:;,.@\^]'): + elif self.is_portugol and scanner.scan(r'(<\-)|(>=)|(<=)|%|<|>|-|\+|\*|\=|(<>)|\/|\.|:|,'): + token = Operator + elif not self.is_portugol and scanner.scan(r'[-+*\/=<>:;,.@\^]'): token = Operator # stop label highlighting on next ";" if collect_labels and scanner.match == ';': @@ -364,35 +471,40 @@ def get_tokens_unprocessed(self, text): # if we are in a special block and a # block ending keyword occurs (and the parenthesis # is balanced) we end the current block context - if (in_function_block or in_property_block) and \ - lowercase_name in self.BLOCK_KEYWORDS and \ - brace_balance[0] <= 0 and \ - brace_balance[1] <= 0: - in_function_block = False - in_property_block = False - brace_balance = [0, 0] - block_labels = set() - if lowercase_name in ('label', 'goto'): - collect_labels = True - elif lowercase_name == 'asm': - stack.append('asm') - elif lowercase_name == 'property': - in_property_block = True - next_token_is_property = True - elif lowercase_name in ('procedure', 'operator', - 'function', 'constructor', - 'destructor'): - in_function_block = True - next_token_is_function = True + if self.is_portugol: + if lowercase_name in ('funcao', 'procedimento'): + in_function_block = True + next_token_is_function = True + else: + if (in_function_block or in_property_block) and \ + lowercase_name in self.BLOCK_KEYWORDS and \ + brace_balance[0] <= 0 and \ + brace_balance[1] <= 0: + in_function_block = False + in_property_block = False + brace_balance = [0, 0] + block_labels = set() + if lowercase_name in ('label', 'goto'): + collect_labels = True + elif lowercase_name == 'asm': + stack.append('asm') + elif lowercase_name == 'property': + in_property_block = True + next_token_is_property = True + elif lowercase_name in ('procedure', 'operator', + 'function', 'constructor', + 'destructor'): + in_function_block = True + next_token_is_function = True # we are in a function block and the current name # is in the set of registered modifiers. highlight # it as pseudo keyword - elif in_function_block and \ + elif not self.is_portugol and in_function_block and \ lowercase_name in self.FUNCTION_MODIFIERS: token = Keyword.Pseudo # if we are in a property highlight some more # modifiers - elif in_property_block and \ + elif not self.is_portugol and in_property_block and \ lowercase_name in ('read', 'write'): token = Keyword.Pseudo next_token_is_function = True @@ -403,40 +515,49 @@ def get_tokens_unprocessed(self, text): # Look if the next token is a dot. If yes it's # not a function, but a class name and the # part after the dot a function name - if scanner.test(r'\s*\.\s*'): + if not self.is_portugol and scanner.test(r'\s*\.\s*'): token = Name.Class # it's not a dot, our job is done else: token = Name.Function next_token_is_function = False + + if self.is_portugol: + block_labels.add(scanner.match.lower()) + # same for properties - elif next_token_is_property: + elif not self.is_portugol and next_token_is_property: token = Name.Property next_token_is_property = False # Highlight this token as label and add it # to the list of known labels - elif collect_labels: + elif not self.is_portugol and collect_labels: token = Name.Label block_labels.add(scanner.match.lower()) # name is in list of known labels elif lowercase_name in block_labels: token = Name.Label - elif lowercase_name in self.BUILTIN_TYPES: + elif self.is_portugol and lowercase_name in self.PORTUGOL_BUILTIN_TYPES: + token = Keyword.Type + elif not self.is_portugol and lowercase_name in self.BUILTIN_TYPES: token = Keyword.Type - elif lowercase_name in self.DIRECTIVES: + elif not self.is_portugol and lowercase_name in self.DIRECTIVES: token = Keyword.Pseudo # builtins are just builtins if the token # before isn't a dot - elif not was_dot and lowercase_name in self.builtins: + elif not self.is_portugol and not was_dot and lowercase_name in self.builtins: token = Name.Builtin else: token = Name - elif scanner.scan(r"'"): + elif self.is_portugol and scanner.scan(r"\""): + token = String + stack.append('string') + elif not self.is_portugol and scanner.scan(r"'"): token = String stack.append('string') - elif scanner.scan(r'\#(\d+|\$[0-9A-Fa-f]+)'): + elif not self.is_portugol and scanner.scan(r'\#(\d+|\$[0-9A-Fa-f]+)'): token = String.Char - elif scanner.scan(r'\$[0-9A-Fa-f]+'): + elif not self.is_portugol and scanner.scan(r'\$[0-9A-Fa-f]+'): token = Number.Hex elif scanner.scan(r'\d+(?![eE]|\.[^.])'): token = Number.Integer @@ -449,18 +570,29 @@ def get_tokens_unprocessed(self, text): scanner.get_char() elif stack[-1] == 'string': - if scanner.scan(r"''"): - token = String.Escape - elif scanner.scan(r"'"): - token = String - stack.pop() - elif scanner.scan(r"[^']*"): - token = String + if self.is_portugol: + if scanner.scan(r"''"): + token = String.Escape + elif scanner.scan(r"\""): + token = String + stack.pop() + elif scanner.scan(r"[^\"]*"): + token = String + else: + scanner.get_char() + stack.pop() else: - scanner.get_char() - stack.pop() - - elif stack[-1] == 'asm': + if scanner.scan(r"''"): + token = String.Escape + elif scanner.scan(r"'"): + token = String + stack.pop() + elif scanner.scan(r"[^']*"): + token = String + else: + scanner.get_char() + stack.pop() + elif not self.is_portugol and stack[-1] == 'asm': if scanner.scan(r'\s+'): token = Whitespace elif scanner.scan(r'end'): @@ -501,6 +633,7 @@ def get_tokens_unprocessed(self, text): stack.pop() # save the dot!!!11 - if scanner.match.strip(): + if not self.is_portugol and scanner.match.strip(): was_dot = scanner.match == '.' + yield scanner.start_pos, token, scanner.match or '' diff --git a/tests/examplefiles/portugol/example.alg b/tests/examplefiles/portugol/example.alg new file mode 100644 index 0000000000..c57545e1c5 --- /dev/null +++ b/tests/examplefiles/portugol/example.alg @@ -0,0 +1,184 @@ +Algoritmo "semnome" +// Descrição : Aqui você descreve o que o programa faz! +// Autor(a) : Lorhan Sohaky +// Data atual : 04/12/2022 +Var +// Seção de Declarações das variáveis + +meu_caractere: caractere +meu_inteiro: inteiro +meu_real: real +meu_vetor: vetor[1..10] de inteiro + +Inicio +// Seção de Comandos, procedimento, funções, operadores, etc... + + escreva("Digite N1:") + leia(n1) + n1 <- 1 + + escreva("Digite N2:") + leia(n2) + + escreval("Valor 1:", n1) + escreva("Valor 2:", n2) + + resultado <- n1 + n2 + escreval(n1,"+", n2, "=", resultado) + + resultado <- n1 - n2 + escreval(n1,"-", n2, "=", resultado) + + resultado <- n1 * n2 + escreval(n1,"*", n2, "=", resultado) + + resultado <- n1 / n2 + escreval(n1,"/", n2, "=", resultado) + + resultado <- n1 DIV n2 + escreval(n1,"DIV", n2, "=", resultado) + + resultado <- n1 MOD n2 + escreval(n1,"MOD", n2, "=", resultado) + + me <- (n1 + n2 + n3) / 3 + escreva("Média:", me) + + vq <- sm / 5 + vp <- sm - (qq * vq) + vpd <- sm - ((vp * 15) / 100) + + se ( n1 > n2 ) entao + escreva("N1 é maior que N2") + fimse + + se ( n2 > n1 ) entao + escreva("N2 é maior que N1") + fimse + + se ( n2 = n1 ) entao + escreva("N2 = N1") + fimse + + se ( n mod 2 <> 0 ) entao + escreva("Impar") + senao + escreva("Par") + fimse + + se (n < 10) entao + escreva("N < 10") + senao + se ( n = 10 ) entao + escreva("N = 10") + senao + se (n > 10) e (n < 50) entao + escreva("10 < N < 50") + senao + se (n = 50) entao + escreva("N = 50") + senao + escreva("N > 50") + fimse + fimse + fimse + fimse + + se ( x = "M" ) ou ( x = "masculino" ) entao + escreva("Sexo: masculino") + senao + se ( x = "F" ) ou ( x = "feminino" ) entao + escreva("Sexo: feminino") + senao + escreva("Digite novamente!") + fimse + fimse + + se (a >= b) e (b >= c) entao + maior <- a + menor <- c + senao + se (a >= c) e (c >= b) entao + maior <- a + menor <- b + senao + se (b >= a) e (a >= c) entao + maior <- b + menor <- c + senao + se (b >= c) e (c >= a) entao + maior <- b + menor <- a + senao + se (c >= a) e (a >= b) entao + maior <- c + menor <- b + senao + maior <- c + menor <- a + fimse + fimse + fimse + fimse + fimse + + escolha (n) + caso 1 + escreva("Janeiro") + caso 2 + escreva("Fevereiro") + caso 3 + escreva("Marco") + caso 4 + escreva("Abril") + caso 5 + escreva("Maio") + caso 6 + escreva("Junho") + caso 7 + escreva("Julho") + caso 8 + escreva("Agosto") + caso 9 + escreva("Setembro") + caso 10 + escreva("Outubro") + caso 11 + escreva("Novembro") + caso 12 + escreva("Dezembro") + outrocaso + escreva("'Numero invalido'") + fimescolha + + enquanto (n <11) faca + escreva(n) + n <- n + 1 + fimenquanto + + para n de 1 ate 10 faca + escreva(n) + fimpara + + funcao soma: inteiro + var aux: inteiro + inicio + // n, m e res são variáveis globais + aux <- n + m + retorne aux + fimfuncao + + res <- soma + escreva(res) + + funcao soma (x,y: inteiro): inteiro + inicio + retorne x + y + fimfuncao + + n <- 4 + m <- -9 + res <- soma(n,m) + Pi * 10 + escreva(res * Pi * exp(10)) +Fimalgoritmo \ No newline at end of file diff --git a/tests/examplefiles/portugol/example.alg.output b/tests/examplefiles/portugol/example.alg.output new file mode 100644 index 0000000000..2db9b36fa7 --- /dev/null +++ b/tests/examplefiles/portugol/example.alg.output @@ -0,0 +1,1195 @@ +'Algoritmo' Keyword +' ' Text.Whitespace +'"' Literal.String +'semnome' Literal.String +'"' Literal.String +'\n' Text.Whitespace + +'// Descrição : Aqui você descreve o que o programa faz!' Comment.Single +'\n' Text.Whitespace + +'// Autor(a) : Lorhan Sohaky' Comment.Single +'\n' Text.Whitespace + +'// Data atual : 04/12/2022' Comment.Single +'\n' Text.Whitespace + +'Var' Keyword +'\n' Text.Whitespace + +'// Seção de Declarações das variáveis ' Comment.Single +'\n\n' Text.Whitespace + +'meu_caractere' Name +':' Operator +' ' Text.Whitespace +'caractere' Keyword.Type +'\n' Text.Whitespace + +'meu_inteiro' Name +':' Operator +' ' Text.Whitespace +'inteiro' Keyword.Type +'\n' Text.Whitespace + +'meu_real' Name +':' Operator +' ' Text.Whitespace +'real' Keyword.Type +'\n' Text.Whitespace + +'meu_vetor' Name +':' Operator +' ' Text.Whitespace +'vetor' Keyword +'[' Punctuation +'1' Literal.Number.Integer +'.' Operator +'.' Operator +'10' Literal.Number.Integer +']' Punctuation +' ' Text.Whitespace +'de' Name +' ' Text.Whitespace +'inteiro' Keyword.Type +'\n\n' Text.Whitespace + +'Inicio' Keyword +'\n' Text.Whitespace + +'// Seção de Comandos, procedimento, funções, operadores, etc... ' Comment.Single +'\n\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Digite N1:' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'leia' Keyword +'(' Punctuation +'n1' Name +')' Punctuation +'\n ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'1' Literal.Number.Integer +'\n\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Digite N2:' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'leia' Keyword +'(' Punctuation +'n2' Name +')' Punctuation +'\n\n ' Text.Whitespace +'escreval' Keyword +'(' Punctuation +'"' Literal.String +'Valor 1:' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'n1' Name +')' Punctuation +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Valor 2:' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'n2' Name +')' Punctuation +'\n\n ' Text.Whitespace +'resultado' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'n2' Name +'\n ' Text.Whitespace +'escreval' Keyword +'(' Punctuation +'n1' Name +',' Operator +'"' Literal.String +'+' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'n2' Name +',' Operator +' ' Text.Whitespace +'"' Literal.String +'=' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'resultado' Name +')' Punctuation +'\n\n ' Text.Whitespace +'resultado' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'n2' Name +'\n ' Text.Whitespace +'escreval' Keyword +'(' Punctuation +'n1' Name +',' Operator +'"' Literal.String +'-' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'n2' Name +',' Operator +' ' Text.Whitespace +'"' Literal.String +'=' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'resultado' Name +')' Punctuation +'\n\n ' Text.Whitespace +'resultado' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +'*' Operator +' ' Text.Whitespace +'n2' Name +'\n ' Text.Whitespace +'escreval' Keyword +'(' Punctuation +'n1' Name +',' Operator +'"' Literal.String +'*' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'n2' Name +',' Operator +' ' Text.Whitespace +'"' Literal.String +'=' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'resultado' Name +')' Punctuation +'\n\n ' Text.Whitespace +'resultado' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +'/' Operator +' ' Text.Whitespace +'n2' Name +'\n ' Text.Whitespace +'escreval' Keyword +'(' Punctuation +'n1' Name +',' Operator +'"' Literal.String +'/' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'n2' Name +',' Operator +' ' Text.Whitespace +'"' Literal.String +'=' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'resultado' Name +')' Punctuation +'\n\n ' Text.Whitespace +'resultado' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +'DIV' Keyword +' ' Text.Whitespace +'n2' Name +'\n ' Text.Whitespace +'escreval' Keyword +'(' Punctuation +'n1' Name +',' Operator +'"' Literal.String +'DIV' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'n2' Name +',' Operator +' ' Text.Whitespace +'"' Literal.String +'=' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'resultado' Name +')' Punctuation +'\n\n ' Text.Whitespace +'resultado' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +'MOD' Keyword +' ' Text.Whitespace +'n2' Name +'\n ' Text.Whitespace +'escreval' Keyword +'(' Punctuation +'n1' Name +',' Operator +'"' Literal.String +'MOD' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'n2' Name +',' Operator +' ' Text.Whitespace +'"' Literal.String +'=' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'resultado' Name +')' Punctuation +'\n\n ' Text.Whitespace +'me' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'(' Punctuation +'n1' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'n2' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'n3' Name +')' Punctuation +' ' Text.Whitespace +'/' Operator +' ' Text.Whitespace +'3' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Média:' Literal.String +'"' Literal.String +',' Operator +' ' Text.Whitespace +'me' Name +')' Punctuation +'\n\n ' Text.Whitespace +'vq' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'sm' Name +' ' Text.Whitespace +'/' Operator +' ' Text.Whitespace +'5' Literal.Number.Integer +'\n ' Text.Whitespace +'vp' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'sm' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'(' Punctuation +'qq' Name +' ' Text.Whitespace +'*' Operator +' ' Text.Whitespace +'vq' Name +')' Punctuation +'\n ' Text.Whitespace +'vpd' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'sm' Name +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'((' Punctuation +'vp' Name +' ' Text.Whitespace +'*' Operator +' ' Text.Whitespace +'15' Literal.Number.Integer +')' Punctuation +' ' Text.Whitespace +'/' Operator +' ' Text.Whitespace +'100' Literal.Number.Integer +')' Punctuation +'\n\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'n2' Name +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'N1 é maior que N2' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'fimse' Keyword +'\n\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'n2' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'N2 é maior que N1' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'fimse' Keyword +'\n\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'n2' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'n1' Name +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'N2 = N1' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'fimse' Keyword +' \n\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'n' Name +' ' Text.Whitespace +'mod' Keyword +' ' Text.Whitespace +'2' Literal.Number.Integer +' ' Text.Whitespace +'<' Operator +'>' Operator +' ' Text.Whitespace +'0' Literal.Number.Integer +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Impar' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Par' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'fimse' Keyword +'\n\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +'n' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'10' Literal.Number.Integer +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'N < 10' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'n' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'10' Literal.Number.Integer +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'N = 10' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +'n' Name +' ' Text.Whitespace +'>' Operator +' ' Text.Whitespace +'10' Literal.Number.Integer +')' Punctuation +' ' Text.Whitespace +'e' Keyword +' ' Text.Whitespace +'(' Punctuation +'n' Name +' ' Text.Whitespace +'<' Operator +' ' Text.Whitespace +'50' Literal.Number.Integer +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'10 < N < 50' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +'n' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'50' Literal.Number.Integer +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'N = 50' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'N > 50' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'fimse' Keyword +'\n ' Text.Whitespace +'fimse' Keyword +'\n ' Text.Whitespace +'fimse' Keyword +'\n ' Text.Whitespace +'fimse' Keyword +'\n\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'x' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'M' Literal.String +'"' Literal.String +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'ou' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'x' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'masculino' Literal.String +'"' Literal.String +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Sexo: masculino' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'senao' Keyword +' \n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'x' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'F' Literal.String +'"' Literal.String +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'ou' Keyword +' ' Text.Whitespace +'(' Punctuation +' ' Text.Whitespace +'x' Name +' ' Text.Whitespace +'=' Operator +' ' Text.Whitespace +'"' Literal.String +'feminino' Literal.String +'"' Literal.String +' ' Text.Whitespace +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Sexo: feminino' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Digite novamente!' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'fimse' Keyword +'\n ' Text.Whitespace +'fimse' Keyword +'\n\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +'a' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'b' Name +')' Punctuation +' ' Text.Whitespace +'e' Keyword +' ' Text.Whitespace +'(' Punctuation +'b' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'c' Name +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'maior' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'a' Name +'\n ' Text.Whitespace +'menor' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'c' Name +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +'a' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'c' Name +')' Punctuation +' ' Text.Whitespace +'e' Keyword +' ' Text.Whitespace +'(' Punctuation +'c' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'b' Name +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'maior' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'a' Name +'\n ' Text.Whitespace +'menor' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'b' Name +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +'b' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'a' Name +')' Punctuation +' ' Text.Whitespace +'e' Keyword +' ' Text.Whitespace +'(' Punctuation +'a' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'c' Name +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'maior' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'b' Name +'\n ' Text.Whitespace +'menor' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'c' Name +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +'b' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'c' Name +')' Punctuation +' ' Text.Whitespace +'e' Keyword +' ' Text.Whitespace +'(' Punctuation +'c' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'a' Name +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'maior' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'b' Name +'\n ' Text.Whitespace +'menor' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'a' Name +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'se' Keyword +' ' Text.Whitespace +'(' Punctuation +'c' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'a' Name +')' Punctuation +' ' Text.Whitespace +'e' Keyword +' ' Text.Whitespace +'(' Punctuation +'a' Name +' ' Text.Whitespace +'>=' Operator +' ' Text.Whitespace +'b' Name +')' Punctuation +' ' Text.Whitespace +'entao' Keyword +'\n ' Text.Whitespace +'maior' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'c' Name +'\n ' Text.Whitespace +'menor' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'b' Name +'\n ' Text.Whitespace +'senao' Keyword +'\n ' Text.Whitespace +'maior' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'c' Name +'\n ' Text.Whitespace +'menor' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'a' Name +'\n ' Text.Whitespace +'fimse' Keyword +'\n ' Text.Whitespace +'fimse' Keyword +'\n ' Text.Whitespace +'fimse' Keyword +'\n ' Text.Whitespace +'fimse' Keyword +'\n ' Text.Whitespace +'fimse' Keyword +'\n\n ' Text.Whitespace +'escolha' Keyword +' ' Text.Whitespace +'(' Punctuation +'n' Name +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'1' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Janeiro' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'2' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Fevereiro' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'3' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Marco' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'4' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Abril' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'5' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Maio' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'6' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Junho' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'7' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Julho' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'8' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Agosto' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'9' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Setembro' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'10' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Outubro' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'11' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Novembro' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'caso' Keyword +' ' Text.Whitespace +'12' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +'Dezembro' Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'outrocaso' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'"' Literal.String +"'Numero invalido'" Literal.String +'"' Literal.String +')' Punctuation +'\n ' Text.Whitespace +'fimescolha' Keyword +'\n\n ' Text.Whitespace +'enquanto' Keyword +' ' Text.Whitespace +'(' Punctuation +'n' Name +' ' Text.Whitespace +'<' Operator +'11' Literal.Number.Integer +')' Punctuation +' ' Text.Whitespace +'faca' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'n' Name +')' Punctuation +'\n ' Text.Whitespace +'n' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'n' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'1' Literal.Number.Integer +'\n ' Text.Whitespace +'fimenquanto' Keyword +'\n\n ' Text.Whitespace +'para' Keyword +' ' Text.Whitespace +'n' Name +' ' Text.Whitespace +'de' Name +' ' Text.Whitespace +'1' Literal.Number.Integer +' ' Text.Whitespace +'ate' Keyword +' ' Text.Whitespace +'10' Literal.Number.Integer +' ' Text.Whitespace +'faca' Keyword +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'n' Name +')' Punctuation +'\n ' Text.Whitespace +'fimpara' Keyword +'\n\n ' Text.Whitespace +'funcao' Keyword +' ' Text.Whitespace +'soma' Name.Function +':' Operator +' ' Text.Whitespace +'inteiro' Keyword.Type +'\n ' Text.Whitespace +'var' Keyword +' ' Text.Whitespace +'aux' Name +':' Operator +' ' Text.Whitespace +'inteiro' Keyword.Type +'\n ' Text.Whitespace +'inicio' Keyword +'\n ' Text.Whitespace +'// n, m e res são variáveis globais' Comment.Single +'\n ' Text.Whitespace +'aux' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'n' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'m' Name +'\n ' Text.Whitespace +'retorne' Keyword +' ' Text.Whitespace +'aux' Name +'\n ' Text.Whitespace +'fimfuncao' Keyword +'\n\n ' Text.Whitespace +'res' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'soma' Name.Label +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'res' Name +')' Punctuation +'\n\n ' Text.Whitespace +'funcao' Keyword +' ' Text.Whitespace +'soma' Name.Function +' ' Text.Whitespace +'(' Punctuation +'x' Name +',' Operator +'y' Name +':' Operator +' ' Text.Whitespace +'inteiro' Keyword.Type +')' Punctuation +':' Operator +' ' Text.Whitespace +'inteiro' Keyword.Type +'\n ' Text.Whitespace +'inicio' Keyword +'\n ' Text.Whitespace +'retorne' Keyword +' ' Text.Whitespace +'x' Name +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'y' Name +'\n ' Text.Whitespace +'fimfuncao' Keyword +'\n\n ' Text.Whitespace +'n' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'4' Literal.Number.Integer +'\n ' Text.Whitespace +'m' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'-' Operator +'9' Literal.Number.Integer +'\n ' Text.Whitespace +'res' Name +' ' Text.Whitespace +'<-' Operator +' ' Text.Whitespace +'soma' Name.Label +'(' Punctuation +'n' Name +',' Operator +'m' Name +')' Punctuation +'\n ' Text.Whitespace +'Pi' Keyword +' ' Text.Whitespace +'*' Operator +' ' Text.Whitespace +'10' Literal.Number.Integer +'\n ' Text.Whitespace +'escreva' Keyword +'(' Punctuation +'res' Name +' ' Text.Whitespace +'*' Operator +' ' Text.Whitespace +'Pi' Keyword +' ' Text.Whitespace +'*' Operator +' ' Text.Whitespace +'exp' Name +'(' Punctuation +'10' Literal.Number.Integer +'))' Punctuation +'\n' Text.Whitespace + +'Fimalgoritmo' Keyword +'\n' Text.Whitespace