Несколько правил одно и то же действие в 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
являются терминалами, и вам действительно не нужно различать их в грамматике, может быть проще просто вернуть тот же терминал из сканера.