B. Вася ба Төрлүүд

хугацааны хязгаарлалт 2 секунд

санах ойн хязгаарлалт 256 мегабайт

оролт стандарт оролт

гаралт стандарт гаралт

Программист Вася &K* нэртэй шинэ программчлалын хэлийг сурч байгаа. &K* хэл C бүлийн хэлний синтаксуудтай төстэй. Ямартай ч энэ хэл илүү хүчирхэг учраас C-шиг хэлний дүрмүүдийг ашиглах нь тохиромжгүй юм. Бодлогын өгүүлбэрийг ойлгохын тулд програмчлалын хэлний тайлбарыг сайн уншина уу. Учир нь жинхэнэ програмчлалын хэлтэй төсгүй.

&K* хэлний заагч нь маш хүчирхэг системтэй - $X$ төрлийн заагчийн баруун талд * тэмдэг нэмснээр - $X * $ гэх шинэ төрөлтэй болно. Үүнийг заагч-тодорхойлогч гэж нэрлэдэг. Яг энүүний эсрэгээр $X$ төрлийн заагчид & тэмдэг нэмснээр - $&X$ нь $X$ заагч алинд хамаарахыг зааж өгнө. Үүнийг эсрэг-хамааруулагч гэж нэрлэдэг.

&K* хэл хоёр үндсэн мэдээллийн төрөлтэй -- void$ болон errtype$. Бас хэл нь typedef$, typeof$ гэсэн үйлдлүүдтэй.

  • "typedef $A$ $B$$" үйлдэл нь шинэ $B$ төрлийг $A$ төрөлтэй адилхан үүсгэдэг. $A$ нь * эсвэл & тэмдэгтэй байх ба $B$-д аль нь ч байхгүй. Жишээ нь, typedef void* ptptvoid$ үйлдэл шинэ ptptvoid$ төрлийг void*$ төрлөөр үүсгэдэг.
  • "typeof $A$$" үйлдэл $A$-н төрлийг буцаадаг, void...*$ хэлбэртэй ямар ч тооны * агуулдаг (тэг ч байж болно). Өмнө нь тодорхойлсон ptptvoid$-н хувьд typeof ptptvoid$ үйлдэл нь void$-г буцаана.

void$ төрлийг эсрэг-хамааруулагч хийхийг оролдвол алдаа заана : энэ нь шинэ errtype$ төрлийг буцаана. errtype$ төрлийн хувьд дараах нөхцлийг хангана : errtype*$$ = $&errtype$$ = $errtype$. Энэхүү төрлийг хэрэглэхийг оролдвол үр дүн нь өмнө нь тодорхойлсоноор errtype$ төрлийг буцаана.

typedef$-г ашиглаад нэг төрлийг олон дахин тодорхойлж болно. Бүх тодорхойлолтын хамгийн сүүлийнх нь хүчин төгөлдөр. Гэсэн хэдий ч өмнө нь тодорхойлсон төрлүүд өөрчлөгдөхгүй.

Эсрэг-хамааруулах үйлдэл нь заагч-тодорхойлогчоос дараа нь хийгдэнэ, ө.х $&T * $ нь $T$ гарна.

Үйлдлүүд дарааллан нэг нэгээрээ хийгддэг. Хэрэв бид "typedef &void a$", "typedef a* b$" үйлдлүүдийг хийх бол эхлээд a$ нь errtype$ болж, дараа нь b$ errtype* = errtype$ болдог, гэхдээ &void* = void$ биш (хоёрдугаар жишээг хар).

Вася энэхүү хүчирхэг технологийг сайн ойлгож чадаагүй учраас таниас тусламж хүссэн юм. Өгөгдсөн үйлдлүүдийг анализ хийх програм бич.

Оролт

Эхний мөрөнд $n$ ($1 ≤ n ≤ 100$) - үйлдлүүдийн дугаар. Дараагийн $n$ мөр бүрд "typedef $A$ $B$$" эсвэл "typeof $A$$" хэлбэртэй байна. Эхний төрлийн үйлдэлд $B$ төрөл void$ болон errtype$ төрлүүдээс ялгаатай ба * болон & агуулаагүй байна.

Бүх өгөгдөл хоосон биш 20-иос хэтрэхгүй урттай латин жижиг үсгүүд байна. * болон & тэмдэгтүүдийн тоо 10-аас хэтрэхгүй, гэсэн хэдий ч зарим void$ төрлүүд олон *-той байж болох ба 10-аас хэтэрч болно.

Гаралт

typeof$ үйлдэл болгонд харгалзах буцаах утгыг хэвлэнэ.

Орчуулсан: Б.Алтангэрэл

Жишээ тэстүүд

Оролт
5
typedef void* ptv
typeof ptv
typedef &&ptv node
typeof node
typeof &ptv
Гаралт
void*
errtype
void
Оролт
17
typedef void* b
typedef b* c
typeof b
typeof c
typedef &b b
typeof b
typeof c
typedef &&b* c
typeof c
typedef &b* c
typeof c
typedef &void b
typeof b
typedef b******* c
typeof c
typedef &&b* c
typeof c
Гаралт
void*
void**
void
void**
errtype
void
errtype
errtype
errtype

Тэмдэглэл

Хоёрдугаар жишээг ажиглая.

Эхний хоёр хүсэлтийн дараа b$ төрөл void$, ба с$ төрөл void*$ болно.

Дараагийн typedef$ хүсэлт b$-г &b = &void* = void$ болгон өөрчлөх ба с$ төрөл өөрчлөгдөхгүй.

Түүний дараа с$ төрөл дахин &&b* = &&void* = &void = errtype$ болж шинэчлэгдэнэ. Энэ нь b$ төрөлд нөлөө үзүүлэхгүй. Ийм учраас дараагийн typedef$ үйлдэл c$-г &void* = void$ болгон тодорхойлно.

Дараа нь b$ төрөл &void = errtype$ гэж тодорхойлогдоно.

Дараагийн хүсэлт дэх c$ төрлийг errtype* = errtype$ гэж тодорхойлж байгаа ба &void* = void**$ гэж биш. Сүүлийн typedef$ үйлдэл мөн адил.

Сэтгэгдлүүдийг ачааллаж байна...