Некоторые версии Yacc используют '=' между правилами и действиями? - PullRequest
2 голосов
/ 01 июля 2019

Я компилирую очень старую программу (wu-ftpd 2.6.1 около 2000), и она не работает в этом коде:

cmd_list:   /* empty */
    | cmd_list cmd
    =   {
        fromname = (char *) NULL;
        restart_point = 0;
    }
    | cmd_list rcmd
    ;

Бизон говорит, что проблема в неожиданном '=', что имеет смысл, поскольку любая другая программа Yacc, которую я видел (правда, не очень много), не использует там знак '='. Я заменил шаблон =\t{ на \t{ и сборки программного обеспечения (со многими предупреждениями, конечно), но мне интересно, как он создавался в прошлом. Изменился ли синтаксис Yacc?

1 Ответ

5 голосов
/ 02 июля 2019

Да, очень старые версии yacc позволяли сигнализировать семантическое действие с помощью =. Они также допускали действия, состоящие из отдельных утверждений без заключенных в скобки.

Этот синтаксис был отмечен как устаревший в оригинальной статье Стивена Джонсона по Yacc , которая датируется 1970-ми годами. См. Приложение D: Старые функции поддерживаются, но не поощряются :

  1. Действия могут также иметь форму

    =     { . . . } 
    

    и фигурные скобки могут быть отброшены, если действие представляет собой один оператор C.

Я быстро проверил свой жесткий диск и обнаружил, что синтаксис ={...} был принят bison 1.2.5 (1996), но, похоже, его нет в v1.875 (2003). Где-то между этими двумя версиями оригинальный лексер, созданный вручную bison, был заменен на лексер, сгенерированный (f) lex (а ручной синтаксический анализатор был заменен загрузочным анализатором); Я предполагаю, что устаревший синтаксис никогда не превращался в новый синтаксический анализатор.

...