eaglus wrote:
>
> Есть ли какие-то методы для формального описания таких "нестрогих"
> грамматик?
Насчет организации грамматики уже написали — вам не нужно отслеживать
всю структуру языка, то есть все правила будут выскокоуровневыми. Кроме
того, есть два предложения:
1) Использовать отсечки как в прологе. Отсечка обозначает точку к
которой проиваодится возврат. Например в правиле:
S = 'unit' ! identifier ';'
парсер, встретив во входном потоке слово 'unit' не возвращается назад —
правило считается выполненным.
2) Использовать правила синхронизации или разбиения на выражения при
возникновении ошибки, как в yacc. Например, предыдущее выражение
запишется так:
S = 'unit' ! ( identifier ';' | error ';' )
Здесь запись error ';' обозначает, что при возникновении ошибки, правило
считается выполненым, ошибка игнорируется ее и входной поток читается до
символа точки с запятой. Конечно, в качестве синхронизирующей
последовательности можно использовать регулярное выражение.
Так же можно применять одно правило синхронизации ко нескольким
выражениям, и совместить это с отсечками. Что-то наподобие:
S = 'procedure' {{ identifier arg-decl }} ';'
S = 'function' {{ identifier arg-decl }} ';'
S = 'class' {{ identifier '{' }} '}.*;'
Здесь лексема {{ показывает начало отсечки, а то, что следует за }} —
правило синхронизации.
Posted via RSDN NNTP Server 2.1 beta