2016-05-10 4 views
1

В настоящее время я пытаюсь реализовать лексический сканер, который позже станет частью компилятора. Программа использует регулярные выражения для соответствия входному программному файлу. Если ряд символов, не содержащих пробел, сопоставляется с регулярным выражением, раздел согласованного входа затем преобразуется в токен, который вместе с остальными другими токенами будет отправлен в синтаксический анализатор. У меня работает код, так что правильные маркеры выводятся правильно, но мне нужно сделать так, чтобы сканер создавал исключение (вызываемое методом no_token()), если найден ряд небелых символов, которые не соответствуют ни одному из заданные регулярные выражения. Это мой первый пост здесь, поэтому, пожалуйста, если у вас есть какие-либо советы о том, как я могу улучшить свои сообщения, пожалуйста, дайте мне знать или вам потребуется дополнительная информация по вопросу или коду, пожалуйста, спросите.Как проверить последовательность символов, которые не соответствуют Regex

def get_token(self): 
    '''Returns the next token and the part of input_string it matched. 
     The returned token is None if there is no next token. 
     The characters up to the end of the token are consumed. 
     Raise an exception by calling no_token() if the input contains 
     extra non-white-space characters that do not match any token.''' 
    self.skip_white_space() 
    # find the longest prefix of input_string that matches a token 
    token, longest = None, '' 
    for (t, r) in Token.token_regexp: 
     match = re.match(r, self.input_string[self.current_char_index:]) 
     if match is None: 
      self.no_token() 
     elif match and match.end() > len(longest): 
      token, longest = t, match.group() 
    self.current_char_index += len(longest) 
    return (token, longest) 

, как вы можете видеть, что я попытался с помощью

if match is None: 
    self.no_token() 

, но это производит исключение и выходит из программы на старте и не токены не возвращаются, но если я закомментируйте код работает отлично , Очевидно, мне нужен этот раздел, чтобы создать исключение, если символы без пробела не соответствуют никакому регулярному выражению, или это вызовет проблемы на более поздних этапах разработки.

Метод skip_white_space() использует все белые пробелы до следующего небелого пространства character, , регулярные выражения хранятся в token_regexp, а self.input_string[self.current_char_index:]) - текущий символ.

для программы в виде текстового файла:

z := 2; 
if z < 3 then 
    z := 1 
end 

без вызова no_token выход является:

ID z 

BEC 

NUM 2 

SEM 

IF 

ID z 

LESS 

NUM 3 

THEN 

ID z 

BEC 

NUM 1 

END 

, который является правильным, но когда я пытаюсь осуществить вызов no_token() я получаю:

lexical error: no token found at the start of z := 2; 
if z < 3 then 
    z := 1 
end 

который является то, что no_token() методами выхода, если есть серы ies символов, которые не соответствуют регулярному выражению, которое я реализовал в сканере, но это не так для этого ввода. Все последовательности символов здесь действительны.

+0

Чтобы ответить на ваш вопрос, вы можете использовать [отрицательное опережения утверждение] (https://docs.python.org/3/library/re.html#regular -expression-syntax), если вам действительно нужно. [Минимальный, проверенный, полный пример] (/ help/mvce) действительно будет более полезен для получения ответа, чем длинное объяснение и совсем немного несвязанного кода. – Kupiakos

+0

Спасибо за быстрый ответ. Я прочитаю https://docs.python.org/2/library/re.html и посмотрю, поможет ли это мне. Когда вы говорите поддающийся проверке, минимальный полный ответ, вы имеете в виду пример ввода и ожидаемого результата? Я не уверен, как код не связан, поскольку это единственный вызов no_token() во всей программе, и это причина, по которой происходит ошибка. – saleem

+0

. Пример ввода и ожидаемого вывода - это минимальный минимум, да. – Kupiakos

ответ

0

Получил все данные. Приветствия

def get_token(self): 
    '''Returns the next token and the part of input_string it matched. 
     The returned token is None if there is no next token. 
     The characters up to the end of the token are consumed. 
     Raise an exception by calling no_token() if the input contains 
     extra non-white-space characters that do not match any token.''' 
    self.skip_white_space() 
    # find the longest prefix of input_string that matches a token 
    token, longest = None, '' 
    for (t, r) in Token.token_regexp: 
     match = re.match(r, self.input_string[self.current_char_index:]) 
     if match and match.end() > len(longest): 
      token, longest = t, match.group() 

    self.current_char_index += len(longest) 
    if token == None and self.current_char_index < len(self.input_string): 
     self.no_token() 
    return (token, longest) 

был последний рабочий код

Смежные вопросы