Я работаю над лексером для грамматики Python (написанной на Flex) для класса конструктора компилятора, и у меня возникают проблемы с получением правильно работающего регулярного выражения, которое можно перехватить, когда в начале строки нет пробела(для учета конца блока с отступом).
Правило, проверяющее отсутствие отступов, появляется после тех, которые проверяют комментарии, пустые строки и отступы.Это также перед проверкой правил для чего-либо еще.Вот как это выглядит прямо сейчас:
<INITIAL>^[^ \t] {
printf("DEBUG: Expression ^[^ \\t] matches string: %s\n", yytext);
/* Dedent to 0 if not mid-expression */
if(!lineJoin && bracketDepth() == 0)
changeIndent(0);
/* Treat line as normal */
REJECT;
}
Насколько я понимаю, вышеприведенное правило должно выводить эту строку отладки для любой строки в лексированном файле, которая имеет реальный код python, но нене начинать с отступа.Тем не менее, в его нынешнем виде очень немногие строки в моих многочисленных текстовых случаях отображают его.
Например, выходные данные отладки нигде не отображаются для этого тестового примера (он также полностью пропускает отступ в строке 4):
myList = [1,2,3,4]
for index in range(len(myList)):
myList[index] += 1
print( myList )
, но появляется для каждой строки в этой:
a = 1 + 1
b = 2 % 3
c = 1 ^ 1
d = 1 - 1
f = 1 * 1
g = 1 / 1
Учитывая, что большинство других правил работают должным образом, я склонен полагать, что регулярное выражение является проблемой в приведенном вышеправить, но я не понимаю, почему этот провал большую часть времени.У кого-нибудь есть понимание?