Регулярное выражение, чтобы поймать, что в начале строки нет пробелов (flex) - PullRequest
2 голосов
/ 06 марта 2011

Я работаю над лексером для грамматики 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

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

1 Ответ

3 голосов
/ 06 марта 2011

Я не знаю, flex, но я замечаю, что каждый сэмпл работает с одним символом, а каждый сработал - нет. Возможно, flex соответствует целым токенам вместо отдельных символов? Вы можете попробовать добавить + после класса символов.

...