Как оценить совпавшее число позже в регулярном выражении? - Лексинг FORTRAN 'H' редактировать дескриптор с Ply - PullRequest
1 голос
/ 07 февраля 2010

Я использую Ply для интерпретации строки формата FORTRAN. У меня возникают проблемы при написании регулярного выражения, соответствующего дескриптору редактирования 'H' , который имеет форму

x H ccccc ...

где x указывает число символов для чтения после 'H'

Ply сопоставляет токены с одним регулярным выражением, но у меня возникают проблемы с использованием регулярного выражения для выполнения вышеуказанного. Я ищу что-то вроде

(\d+)[Hh].{\1}

где \1 анализируется как целое число и оценивается как часть регулярного выражения - однако это не так.

Похоже, что невозможно использовать совпадающие числа позже в том же регулярном выражении , так ли это?

У кого-нибудь есть другие решения, которые могут использовать Ply?

Ответы [ 3 ]

2 голосов
/ 07 февраля 2010

Regex не может делать такие вещи. Вы можете взломать его, хотя:

(1[Hh].|2[Hh]..|3[Hh]...|etc...)

Гадкий!

0 голосов
/ 08 февраля 2010

Pyparsing включает в себя адаптивное выражение, очень похожее на это, называемое counttedArray. counttedArray (expr) анализирует начальное целое число 'n', а затем анализирует 'n' экземпляров выражения expr, возвращая весь массив в виде одного списка. Это работает так, что countedArray анализирует ведущее целочисленное выражение, за которым следует неинициализированное выражение Forward. К выражению, являющемуся ведущим целым числом, прикреплено действие синтаксического анализа, которое назначает следующий Forward для 'n' * expr. Затем анализатор pyparsing продолжает работу и анализирует следующий 'n' expr. Так что это своего рода самоизменяющийся парсер.

Для анализа вашего выражения это будет выглядеть примерно так:

integer = Word(nums).setParseAction(lambda t:int(t[0]))
following = Forward()
integer.addParseAction(lambda t: following << Word(printables+" ",exact=t[0]))
H_expr = integer + 'H' + following
print H_expr.parseString("22HThis is a test string.This is not in the string")

Печать:

[22, 'H', 'This is a test string.']

Если у Ply есть что-то похожее, возможно, вы могли бы использовать эту технику.

0 голосов
/ 07 февраля 2010

Это то, что приходит в голову, что регулярные выражения могут заменить лексер.

Короткая версия: регулярные выражения могут иметь дело только с этим небольшим подмножеством из всех возможных языков, называемых "регулярными" (я знаю, это большое удивление). Но «регулярный» не изоморфен человеческому пониманию «простых», поэтому даже очень простые языки могут иметь нерегулярные выражения.

Написание лексера для простого языка не очень сложно.

Этот канонический вопрос переполнения стека для ресурсов по теме: Обучение написанию компилятора .


Ах. Кажется, я неправильно понял вопрос. Моя вина.

Я не знаком с ply, и уже давно я использую flex, но думаю, что вы съели бы любое число следующих цифр, а затем отметьте в связанном коде заблокировать, если правила были соблюдены.

...