diff --git a/verify_mnh_expand.py b/verify_mnh_expand.py index 854eb445dae328cfe1c4a8fc8b6a24c6ca0570c6..c6e3d934e304a10657ab64a570709cbf7ae597cb 100755 --- a/verify_mnh_expand.py +++ b/verify_mnh_expand.py @@ -15,8 +15,11 @@ def verify_mnh_expand(path): Limitation: - if the '=' sign is not on same line than the left hand side of the affectation instruction, - the instruction will no be checked - - one-line version of IF or WHERE statement are really on one line (no continuation line) + the instruction will no be checked. And an error can be thrown for the folowing line. + - one-line version of IF or WHERE statement must be really on one line (no continuation line) + - conditional part of IF and WHERE statements should be written on a signle line to be parsed + correctly. + - brackets in comments or in strings can mislead the script """ lhschar = b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_(:)%, \t' @@ -72,25 +75,46 @@ def verify_mnh_expand(path): #affectation instructions. If left hand side is correct (an array element) the right hand side #will be necessarily correct (otherwise a compilation error will be thrown). - #Suppresion of condition in 'IF' and 'WHERE' one-line instructions - if line[:3].upper() in(b'IF ', b'IF('): - line = line[line.index(b'(') + 1:] - nb = 1 - while nb >= 1 and(len(line) > 0): - if line[:1] == b'(': nb += 1 - elif line[:1] == b')': nb -= 1 - line = line[1:].strip() - if line.upper()[:5] in (b'THEN ', b'THEN!'): line = line[5:] - elif line[:6].upper() in(b'WHERE ', b'WHERE('): + #Suppresion of conditional statement in 'IF' and 'WHERE' one-line instructions + #For simplicity, all conditional statements are suppressed + if any([line.startswith(s) for s in (b'IF ', b'IF(', + b'ELSEIF ', b'ELSEIF(', b'ELSE IF ', b'ELSE IF(')]): + try: + line = line[line.index(b'(') + 1:] + nb = 1 + while nb >= 1 and(len(line) > 0): + if line[:1] == b'(': nb += 1 + elif line[:1] == b')': nb -= 1 + line = line[1:].strip() + if nb >= 1 and len(line) == 0: + logging.warning('Parsing error during treatment of an IF statement. ' + + 'The closing bracket should be on the same line as the IF keyword. ' + + 'Line {line} of file {filename}'.format(line=iline + 1, filename=path)) + if line.upper()[:5] in (b'THEN ', b'THEN!'): line = line[5:] + except ValueError: + logging.error('Parsing error during treatment of an IF statement. ' + + 'The opening bracket must be on the same line as the IF keyword. ' + + 'Line {line} of file {filename}'.format(line=iline + 1, filename=path)) + elif any([line.startswith(s) for s in (b'WHERE ', b'WHERE(', + b'ELSEWHERE ', b'ELSEWHERE(', b'ELSE WHERE ', b'ELSE WHERE(')]): if open_directive != b'where': logging.error('There is a WHERE statement in a mnh_expand array bloc. ' 'Line {line} of file {filename}'.format(line=iline + 1, filename=path)) - line = line[line.index(b'(') + 1:] - nb = 1 - while nb >= 1 and(len(line)>0): - if line[:1] == b'(': nb += 1 - elif line[:1] == b')': nb -= 1 - line = line[1:].strip() + try: + line = line[line.index(b'(') + 1:] + nb = 1 + while nb >= 1 and(len(line)>0): + if line[:1] == b'(': nb += 1 + elif line[:1] == b')': nb -= 1 + line = line[1:].strip() + if nb >= 1 and len(line) == 0: + logging.warning('Parsing error during treatment of a WHERE statement. ' + + 'The closing bracket should be on the same line as the WHERE keyword. ' + + 'Line {line} of file {filename}'.format(line=iline + 1, filename=path)) + except ValueError: + logging.error('Parsing error during treatment of a WHERE statement. ' + + 'The opening bracket must be on the same line as the WHERE keyword. ' + + 'Line {line} of file {filename}'.format(line=iline + 1, filename=path)) #Check if it is the left hand side of an affectation if line[:3].upper() == b'DO ':