2013-11-10 2 views
0

Я строю лексер, используя слой в python. У меня есть 2 токена, называемых TkConjuncion (который относится к логическим и) и TkDisjuncion (который относится к логическим и).Ply несбалансированные круглые скобки в регулярном выражении

правила для обоих из них написаны следующим образом (существуют и другие правила, а также, но не относящиеся к делу):

t_TkDisjuncion = '\\\/' 
t_TkConjuncion = '\/\\' 

Где \\\/ является \/ и \/\\/\ является. Но когда я проверить свой код он говорит:

ERROR: Invalid regular expression for rule 't_TkConjuncion'. unbalanced parenthesis

\\ читается лексером как \, поэтому он принимает t_TkDisjuncion, но я не понимаю, почему он не принимает другую фишку. Я занимаюсь поиском в Интернете, но ничего не нашел.

Любые идеи, почему это происходит?

ответ

1

Не знаю, но я ставка есть более чем 1 уровень интерпретации обратной косой черты. Python, конечно же, делает уровень, когда компилирует строковые литералы. Фактические строки, которые вы создаете в вашем примере являются

\/ 

и

/\ 

Если ply продолжает внедрять те, в регулярном выражении, не избежать их первых (это часть я не знаю, о - но подумайте, что это вероятно), то обратная косая черта во второй строке будет действовать, чтобы избежать того, что следует за ней. Скорее всего, это правильная скобка и, следовательно, жалоба «несбалансированных круглых скобок».

Во всяком случае, попробуйте сделать эти сырые строки вместо:

t_TkDisjuncion = r'\\\/' 
t_TkConjuncion = r'\/\\' 

Приставка «R» предотвращает Python от лечения обратной косой черты специально, так что фактические строки эти строки Создаваемые

\\\/ 

и

\/\\ 

Если они затем встроены в регулярное выражение без e сначала скопировав их (до ply, а не до вас), они сделают то, что вы намеревались.

EDIT Я уверен, что все. Глядя на документы ply, маркеры действительно указаны с использованием регулярных выражений, и из-за этого документы рекомендуют использовать необработанные строки (чтобы избежать двойной интерпретации обратных косых черт, о которых я говорил выше).

+0

Да! Вот и все! Это проблема усталости вещей, спасибо за это, я полностью пропустил это (хотя я использую сырые строки в других моих правилах). – Allianz91

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