Кто -нибудь использовал «предпочтения отбора», предоставленные MKS YACC?

StackOverflow https://stackoverflow.com/questions/478891

  •  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 для чего -то вроде дополнения набора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top