如何检查与正则表达式不匹配的字符序列

时间:2016-05-10 22:36:34

标签: python regex compiler-construction lexical-analysis

我目前正在尝试实现一个词法扫描程序,该扫描程序稍后将成为编译器的一部分。该程序使用正则表达式来匹配输入程序文件。如果一系列非空白字符与正则表达式匹配,则匹配的输入部分将转换为令牌,该令牌将与其他其他令牌一起发送给解析器。我有代码工作,以便正确输出正确的令牌,但我需要这样做,以便扫描仪将引发异常(由方法def max_bal(df): max_row = df['col2'].max() labels = np.where((df['col3'] == 'yep') & (df['col2'] == max_row), 'Yes', 'No') return pd.DataFrame(labels, index=df.index) df['col4'] = df.groupby('col1').apply(max_bal) 调用)如果发现一系列非空白字符不匹配给定的任何正则表达式。这是我在这里的第一篇文章,所以如果您有关于如何改进我的帖子的任何提示,请告诉我,或者如果您需要有关问题或代码的更多信息,请询问。

no_token()

你可以看到我尝试使用

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() 消耗所有空格,直到下一个非空格字符, 正则表达式存储在token_regexp中,skip_white_space()给出当前的char。

将程序作为.txt文件:

self.input_string[self.current_char_index:])

没有调用no_token输出是:

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

如果有一系列字符与我在扫描程序中实现的正则表达式不匹配,那么lexical error: no token found at the start of z := 2; if z < 3 then z := 1 end 方法输出的是这个输入不是这种情况。这里的所有字符序列都是有效的。

1 个答案:

答案 0 :(得分: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)

是最终的工作代码