define UTF8CONT [ "80"|"81"|"82"|"83"|"84"|"85"|"86"|"87"|"88"|"89"|"8A"|"8B"|"8C"|"8D"|"8E"|"8F"| "90"|"91"|"92"|"93"|"94"|"95"|"96"|"97"|"98"|"99"|"9A"|"9B"|"9C"|"9D"|"9E"|"9F"| "A0"|"A1"|"A2"|"A3"|"A4"|"A5"|"A6"|"A7"|"A8"|"A9"|"AA"|"AB"|"AC"|"AD"|"AE"|"AF"| "B0"|"B1"|"B2"|"B3"|"B4"|"B5"|"B6"|"B7"|"B8"|"B9"|"BA"|"BB"|"BC"|"BD"|"BE"|"BF" ]; define UTF8'2'BYTE [ "C0"|"C1"|"C2"|"C3"|"C4"|"C5"|"C6"|"C7"|"C8"|"C9"|"CA"|"CB"|"CC"|"CD"|"CE"|"CF"| "D0"|"D1"|"D2"|"D3"|"D4"|"D5"|"D6"|"D7"|"D8"|"D9"|"DA"|"DB"|"DC"|"DD"|"DE"|"DF" ]; define UTF8'3'BYTE [ "E0"|"E1"|"E2"|"E3"|"E4"|"E5"|"E6"|"E7"|"E8"|"E9"|"EA"|"EB"|"EC"|"ED"|"EE"|"EF" ]; define UTF8'4'BYTE [ "F0"|"F1"|"F2"|"F3"|"F4"|"F5"|"F6"|"F7" ]; define UTF8'INVALID [ "F8"|"F9"|"FA"|"FB"|"FC"|"FD"|"FE"|"FF" ]; # define the largest class, the 1 byte characters, by negation so they end # up being handled by the "anything else" case in foma. define UTF8'1'BYTE \[ UTF8'2'BYTE | UTF8'3'BYTE | UTF8'4'BYTE | UTF8'INVALID | UTF8CONT ]; define VALID'UTF8 [ [ UTF8'1'BYTE ] | [ UTF8'2'BYTE UTF8CONT ] | [ UTF8'3'BYTE UTF8CONT UTF8CONT ] | [ UTF8'4'BYTE UTF8CONT UTF8CONT UTF8CONT ] ]*;