Коллеги, прошу внимания!
Пишу я сейчас для книжки по системному программированию транслятор с ассемблера (вернее, несколько разных версий).
Дошел до перемещаемого модуля как результат трансляции.
Соответственно, парсер выражений перестает быть абсолютным и требуется различать относительные и абсолютные имена и выражения.
Обычный парсер написан по методу рекурсивного спуска по следующей обычной грамматике:
E = T {+T|-T}
T = F {*F | /F | %F }
F = A |+A|-A
A = константа|функция|имя|(E)
То есть Е - это абсолютное выражение.
Теперь, чтобы различать абсолютные и относительные, я добавляю в грамматику правилa:
R = R { +V |-V } | (R) | имяR
V = R-R | E
Далее - грамматика для E.
В последнем правиле для Е заменяем имя на имяА. Таким образом, определим две разные функции для получения значения метки: для относительной и абсолютной.

Не будут ли коллеги столь любезны посмотреть на грамматику: нет ли косяка, в котором неправильно смешиваются относительные и абсолютные выражения?