Несколько правил одно и то же действие в YACC

Как указать несколько правил с одинаковым действием в yacc Пример:

variable : string { cout<<$1<<endl; } | int { cout<<$1<<endl; }

2 ответа

Обычно это делается в yacc путем определения промежуточного правила. Например

any_value : string
      | int
      ;
variable  : any_value { 
        cout<<$1<<endl; 
      }
      ;

Если значения были более тесно связаны, чем подразумевается в строке и int, можно использовать лексер, например, путем объединения различных типов чисел (целых, с плавающей запятой) в качестве единого номера типа токена.

Это действительно одно и то же действие? То есть сделать string а также int имеют один и тот же семантический тип, или вы полагаетесь на различные перегрузки << оператор?

Во втором случае (символы имеют разные типы), действия на самом деле не одинаковы, даже если они имеют одинаковое написание, и не существует реального способа их объединить.

В первом случае вы могли бы комбинировать действия, вводя дополнительное производство с правой стороны string | int и затем связывание действия с использованием нового производства. Если string а также int являются терминалами, и вам действительно не нужно различать их в грамматике, может быть проще просто вернуть тот же терминал из сканера.

Другие вопросы по тегам