Вот первое (неполное) решение, которое поднимает некоторые вопросы о том, что вы хотите сделать:
Я использовал более простой синтаксис для краткости и ясности - аргументы функций - это простые цифры или выражения.Имена функций состоят из отдельных букв.Объемный звук заменен на S{}
.Легко перейти от этого к вашему примеру, однако.
sample.txt:
1 A(1)
2 A(1)*B(2)
3 C(2)+A(1)*B(2)
4 C(A(1)*B(2))
5 C(A(1)*B(3)+C(4))
6 A(1)*B(2)+C(3)*D(4)
7 A(1)*B(2)*C(3)*D(4)
8 A(B(2)*C(3))*D(4)
9 C(A(1)+B(3))*C(4)
perl < sample.txt -pe 's/(\w\(\d+\)\*\w\(\d+\))/S{\1}/g'
1 A(1)
2 S{A(1)*B(2)}
3 C(2)+S{A(1)*B(2)}
4 C(S{A(1)*B(2)})
5 C(S{A(1)*B(3)}+C(4))
6 S{A(1)*B(2)}+S{C(3)*D(4)}
7 S{A(1)*B(2)}*S{C(3)*D(4)}
8 A(S{B(2)*C(3)})*D(4)
9 C(A(1)+B(3))*C(4)
Итак, что должна делать строка 7?Что должна делать строка 8?
Строка 9 не работает, потому что мой код недостаточно умен, и я не знаю, НУЖНО ли вам, чтобы он работал.
Я полагаю, что вам действительно нужен парсер (например, yacc), а также лексер.В Perl есть лексер, но нет парсера.
Проблема здесь в том, что вы ищете примеры:
<expression> `*` <expression>
, но так как выражение определено как
<expression> = \d+
| <function>
| <expression> <op> <expression>
Вам нужен нажимной автомат , чтобы сделать это правильно.Регулярные выражения Perl просто не могут этого сделать.
ПРИМЕЧАНИЕ: прошло уже десять лет с моего курса по компиляции, поэтому я могу быть немного шатким в своей терминологии.