Кто -нибудь использовал «предпочтения отбора», предоставленные MKS YACC?
-
20-08-2019 - |
Вопрос
Поскольку я не получил ответа на свой вопрос Есть ли альтернатива MKS YACC, которая поддерживает синтаксис предпочтений выбора или что -то очень похожее?, Я задам более основной вопрос:
- Кто -нибудь использовал «предпочтения отбора», предоставленные MKS YACC?
Если у вас есть, для чего вы его использовали? Кроме того, имеет ли смысл использовать его в чем -то, кроме последней позиции в правиле?
Я должен заботиться о грамматике, которая фигурирует, такие как:
TOKEN1 LPAREN non_terminal1 [^EQUAL] TOKEN2 non_terminal2 RPAREN
Если я что -то неправильно понимаю, предпочтение встроенного отбора не дает никакой ценности в этом контексте.
Фон
MKS YACC поддерживает нотацию, которую вызывает их веб -сайт "Синтаксис предпочтения отбора". Это не иллюстрировано, но состоит из токена или списка токенов в квадратных скобках с каретой (что может быть необязательным), и это указывает на то, что конкретный токен не должен следовать этой конструкции, но этот токен не учитывается как часть этого правила:
non_terminal1: TOKEN1 non_terminal2 TOKEN2 [^TOKEN3]
Итак, в этом правиле говорится, что TOKEN1
с последующим non_terminal2
и TOKEN2
это non_terminal1
, если следующий токен не TOKEN3
В этом случае применяется какое -то другое правило.
(Мне не ясно, может ли элемент кронштейна не быть выпускным. Код, который я видел, используя нотацию, всегда использует токен или пару токенов, разделенных пространством, и никогда не не выпуск. Я также не Очистите, требуется ли каретка; опять же, все примеры, которые я видел, используют карету.)
Решение
Джонатан. В 1:30 утра я не готов пытаться сделать это сам, но какими бы ни делали эти правила, они могут быть сокращенными только для правил, которые могут быть написаны в чем -то вроде обычного BNF. Глядя на это, кажется, что «предпочтение отбора» делает, позволяет вам выразить то, что в противном случае было бы несколькими постановками с одним правилом грамматики.
Я немного копал и нашел это, что подтверждает мое предположение: то, что предпочитает отбор, позволяет вам явно вставлять костюм, чтобы правила, которые в противном случае были бы в смешении, могли быть устранены.
Что я бы посоветовал подумать о том, как будет выглядеть одно из этих правил, если бы переписано в YACC или прямое BNF. Я подозреваю, что это получится что -то вроде
TOKEN1 LPAREN non_terminal1 MULT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 DIVIDE TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 ADD TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 SUBTRACT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 EXP TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 MOD TOKEN2 non_terminal2 RPAREN
...
Так что общий эффект состоит в том, чтобы принять одно правило для каждого оператора кроме равен, [^
Обозначения являются распространенными на различных языках Bell Labs для чего -то вроде дополнения набора.