Files
zeekay a4debdba80 Read a .zap schema the way every other ZAP language reads it
C had no front end for the schema language at all. The compiler directory
holds a code generator plugin, which is handed a request by another tool
and never sees schema text, so a .zap file could not be read here in
either form -- indentation or braces.

zapgen reads it. Whitespace-significant source is rewritten into the brace
form BEFORE the parser, exactly as the Go reference does it: a near
identity that only adds the two tokens the brace grammar requires where
the indented form leaves them out. A file already in braces comes back
byte for byte, so one grammar reads both styles and neither is a dialect
of the other.

The identifier grammar is not restated. Its Unicode ranges are taken from
Go's own tables by gen/table, so a name this parser accepts is a name the
Go parser accepts, and a Go release that moves Unicode moves both.

The generated header gives each struct a view over the message bytes and
one reader per field at a fixed offset. Reading is in place and total: a
field past the end reads zero, a pointer into the head or out of the
message reads null. zap_view.h is the one place that says so.

Checked against the Go front end on every .zap in the estate plus 55
adversarial cases and 15000 random ones: the brace form each writes is
byte-identical, the layout each reads is field-for-field the same, and
they accept and refuse the same files for the same stated reason. A
message built by the Go runtime reads back through these bindings with
every field equal.
2026-09-15 11:32:12 -07:00

42 lines
1.0 KiB
Plaintext

# The schema this generator is checked against, written the way schemas
# are written: no braces, no offsets. Indentation opens a block, and each
# field takes the next free byte after the one before it.
#
# It names every type the dialect has, so the header generated from it
# exercises every reader.
package echo
type id32 = bytes_fixed[32]
# What one peer says.
struct Ping
# The sequence number the reply must carry back.
Seq u64
Sender id32
Note text
Payload bytes
Hops u16
Live bool
Drift f64
Trail list<Ping>
Origin Site
# Where a message came from.
struct Site
Host u32
Port u16
# What the other peer says back.
struct Pong
Seq u64
Delay f32
# Echo answers what it is told, and says how long it took.
interface Echo
# Say something and wait to hear it back.
ping(req: Ping) returns (resp: Pong)
# Say something and do not wait.
notify(req: Ping)
# Ask whether the other side is there at all.
health() returns (resp: Pong)