Advertisement
EduPsEudo

Analisador SOL 2

Sep 29th, 2023
918
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.67 KB | None | 0 0
  1. import re
  2. import webbrowser
  3. import time
  4.  
  5. # Definindo caminho do chrome
  6. chrome_path="C:\Program Files\Google\Chrome\Application\chrome.exe"
  7. webbrowser.register('chrome', None,webbrowser.BackgroundBrowser(chrome_path))
  8.  
  9. # dicionário para mapear os nomes dos tokens com as expressões regulares
  10. regex_tokens = {
  11.     'LOOP': r'loop',
  12.     'BROWSER': r'chrome|firefox|edge|safari',
  13.     'LINK': r'https?://[^\s]+',
  14.     # 'TEMPO': r'\d+',
  15.     'TEMPO': r'15_min|20_min|1_hora|1_dia|2_dias|sem_limite',
  16.     'ESPACO': r'\s+',
  17.     'VEZES': r'1|2|3|4|5',
  18.     'PV': r';'
  19. }
  20.  
  21. def lexer(codigo):
  22.      
  23.     tokens = []
  24.    
  25.     while codigo:
  26.         match = False
  27.         # print(codigo)
  28.         for nome, regex in regex_tokens.items():
  29.             resultado = re.match(regex, codigo) # tenta encontrar um padrão no início da string
  30.             # se encontrou
  31.             if resultado:
  32.                 lexema = resultado.group()  # extrai o texto que corresponde ao token
  33.                 tokens.append((nome, lexema))
  34.                 codigo = codigo[len(lexema):]   # remove o lexema do código
  35.                 match = True    # marca que houve um reconhecimento
  36.                 break
  37.         if not match:
  38.             print('Lexema não reconhecido')
  39.             lexemaErrado = codigo.split()
  40.             raise Exception(f'Lexema não reconhecido: {lexemaErrado[0]}')  # lança uma exceção com a parte inválida do código
  41.     return tokens
  42.  
  43. class NoComando:
  44.     # construtor da classe
  45.     def __init__(self, browser, link, tempo):
  46.     # atributos da classe
  47.         self.browser = browser
  48.         self.link = link
  49.         self.tempo = tempo
  50.     def __str__(self) -> str:
  51.         return self.browser + "," + self.link + "," + self.tempo
  52.  
  53. def reconhece(tokens, lookahead, tipo):
  54.     # print(f'lh: {lookahead}')
  55.     # print(tokens[lookahead])
  56.     if tokens[lookahead][0] == tipo and lookahead < len(tokens):
  57.         return True
  58.     return False
  59.     raise Exception(f'Erro de sintaxe: {tokens[lookahead]}')
  60.  
  61. def tempo(tokens, lookahead):
  62.     if reconhece(tokens, lookahead, 'TEMPO') and reconhece(tokens, lookahead + 1, 'PV'):
  63.         print('reconhece tempo')
  64.         return True
  65.     print('nao foi tempo')
  66.     return
  67.    
  68. def link(tokens, lookahead):
  69.     print(tokens[lookahead])
  70.     if reconhece(tokens, lookahead, 'LINK') and reconhece(tokens, lookahead + 1, 'ESPACO'):
  71.         # print('reconhece link')
  72.         if tempo(tokens, lookahead + 2):
  73.             return True
  74.     else:
  75.         raise Exception(f'Erro de sintaxe: {tokens[lookahead]}')
  76.  
  77. def navegar(tokens, lookahead):
  78.     if reconhece(tokens, lookahead, 'BROWSER') and reconhece(tokens, lookahead + 1, 'ESPACO'):
  79.         # print('reconhece browser')
  80.         if tempo(tokens, lookahead + 2):
  81.             return True
  82.         elif link(tokens, lookahead + 2):
  83.             return True
  84.         else:
  85.             raise Exception(f'Erro de sintaxe: {tokens[lookahead]}')
  86.     else:
  87.         raise Exception(f'Erro de sintaxe: {tokens[lookahead]}')
  88.  
  89. def explore(tokens, lookahead):
  90.     if navegar(tokens, lookahead):
  91.         return True
  92.     else:
  93.         raise Exception(f'Erro de sintaxe: {tokens[lookahead]}')
  94.  
  95. def vezes(tokens, lookahead):
  96.     if reconhece(tokens, lookahead, 'VEZES') and reconhece(tokens, lookahead + 1, 'ESPACO'):
  97.         # print('reconhece vezes')
  98.         if explore(tokens, lookahead + 2):
  99.             return True
  100.     else:
  101.         raise Exception(f'Erro de sintaxe: {tokens[lookahead]}')
  102.  
  103. def programa_sol(tokens, lookahead):
  104.     if reconhece(tokens, lookahead, 'LOOP') and reconhece(tokens, lookahead + 1, 'ESPACO'):
  105.         # print('reconhece loop')
  106.         if vezes(tokens, lookahead + 2):
  107.             return True
  108.     else:
  109.         raise Exception(f'Erro de sintaxe: {tokens[lookahead]}')
  110.  
  111. def parser(tokens):
  112.  
  113.     lookahead = 0
  114.  
  115.     # browser = -1      # Não sei se vai precisar ser usado
  116.     # link = -1
  117.     # tempo = -1
  118.  
  119.     if reconhece(tokens, lookahead, 'LOOP') and reconhece(tokens, lookahead + 1, 'ESPACO'):
  120.         if not programa_sol(tokens, lookahead):
  121.             return False
  122.         else:
  123.             return True     # Arrumar um jeito de fazer o programa_sol retornar um NoComando montado
  124.        
  125.     print('Sintaxe inválida')
  126.     return False
  127.  
  128. def executar(arvore):
  129.     # extrai os atributos do nó da árvore
  130.     browser = arvore.browser
  131.     print(f'Browser: {browser}')
  132.     link = arvore.link
  133.     print(f'Link: {link}')
  134.     tempo = int(arvore.tempo)
  135.     print(f'Tempo: {tempo}')
  136.     # abre o navegador com o link especificado
  137.     webbrowser.get(browser).open(link)
  138.     # espera o tempo especificado em segundos
  139.     time.sleep(tempo)
  140.     # fecha o navegador
  141.     webbrowser.get(browser).close()
  142.  
  143. # lê uma string do usuário
  144. codigo = input('Digite um comando: ')
  145. # chama o lexer para gerar os tokens
  146. tokens = lexer(codigo)
  147. # chama o parser para gerar a árvore sintática
  148. arvore = parser(tokens)
  149. # chama a função para executar o comando
  150.  
  151. print(f'Tokens: {tokens}')
  152. print(f'Arvore: {arvore}')
  153.  
  154. # executar(arvore)
  155.  
  156. # chrome https://www.youtube.com/ 15_min
  157. # loop 2 chrome https://www.youtube.com/ 15_min;
  158. # loop 2 chrome 15_min;
  159.  
  160.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement