По-хорошему, нужно воспользоваться к.-л. генератором компиляторов, описав грамматику в BNF или EBNF. Регулярные выражения не обеспечят необходимой гибкости.
Более-менее, если язык простенький, регулярками можно выделить лексемы (разбить выражение). Проверять корректность надо бы синтаксическим анализатором.
Конкретно для вашего случая что-то вроде (Python):
>>> import re
>>> re.findall("^(([A-Z])->([A-Za-z]+)\|([A-Z]+))", «S->a|AS»)
[('S->a|AS', 'S', 'a', 'AS')]
Или re.match(...).group(n) юзать…