2009-11-25 2 views
0

Я ищу способ шаблона, соответствующий «геометрии» массива, порядок, в котором элементы отображаются, а не содержимое каждого элемента напрямую.шаблон, соответствующий массиву, а не их элементы как таковые

Позвольте мне изложить, что я имею в виду под некоторыми примерами. Учитывая целевой массив:

array('T_STRING','T_VARIABLE','ASSIGN','T_STRING','LPAREN','T_VARIABLE','COMMA','T_VARIABLE','RPAREN'); 
//as a matter of fact, these would be the tokens for the PHP code "foo $var = Foo($arg1,$arg2)' 

Тогда следующий «шаблон» сопрягать бы, возвращение индексов в 0 на основе матчей, а также индексы группировок, так же, как preg_match_all() будет делать для строки:

array('T_STRING', '?', '(', 'T_VARIABLE', 'ASSIGN' ')', '?', 
    'T_STRING', 'LPAREN', '(', 'T_VARIABLE', 'COMMA', '?', ')', '?', 'RPAREN'); 

Это только упрощенное PoC, как я намерен использовать его гораздо сложнее, и я не хочу использовать полный генератор парсеров из PEAR (лимон порт PHP), который был бы излишним.

Знаете ли вы о функции (возможно, не о внутренней функции PHP) или проекте, который делает именно это?

спасибо.

ответ

1

Когда я слышу «сопоставление образцов», я думаю, что «регулярное выражение».

Нажмите этот массив на строку и сопоставьте шаблон, который вы ищете, с помощью регулярного выражения. Вы можете быть в состоянии замены символа, чтобы сделать регулярное выражение небольшим и легко управляемым:

Ваш массив выше, может быть сведена к строке, как это:

$arrayPattern = 'SVASL_PVCVR_P' 

Теперь вы можете использовать регулярные выражения для сопоставления с ним.

if (preg_match('/VA/', $arrayPattern)) 
    print "You've got a Variable followed by an Assign!"; 

Просто мысль ....

+0

Конечно, что-то я уже думал, но как насчет части «возврат индексов на основе 0 совпадений, а также индексы группировок», которые я не написал жирным шрифтом по ошибке? ... – Flavius

+0

Как вы можете знать, если вы собираетесь использовать regexp, третий параметр в 'preg_match ($ expression, $ content, $ matches)' может возвращать согласованные компоненты. Вам, возможно, придется сделать какую-то дополнительную работу оттуда, но она должна дать вам приличный стоп. Однако, в конечном счете, я не уверен, что regexp - лучший способ сделать это. –

1

Если вы ищете анализа кода, то эти slides of Sebastian Bergmann могут быть полезными для вас. Начиная с слайда 17, это примеры для анализа токенами.

+0

Странно. Это правильный URL. Я завернул в крошечный URL, и теперь он должен работать. Имеет ли это? – Gordon

+0

Да, сейчас. – Flavius