// A definition of the basic grammar of DTrace provider definitions.
// Copyright 2021 Oxide Computer Company
// Some basic tokens
PROBE_KEY = @{ "probe" }
PROVIDER_KEY = @{ "provider" }
SEMICOLON = @{ ";" }
LEFT_PAREN = @{ "(" }
RIGHT_PAREN = @{ ")" }
LEFT_BRACE = @{ "{" }
RIGHT_BRACE = @{ "}" }
// A valid identifier for a provider or probe
IDENTIFIER = @{ ASCII_ALPHA+ ~ (ASCII_ALPHANUMERIC | "_")* }
// Data types
BIT_WIDTH = @{ "8" | "16" | "32" | "64" }
SIGNED_INT = ${ "int" ~ BIT_WIDTH ~ "_t" }
UNSIGNED_INT = ${ "uint" ~ BIT_WIDTH ~ "_t" }
STRING = { "char" ~ "*" }
DATA_TYPE = { STRING | UNSIGNED_INT | SIGNED_INT}
// A list of probe arguments, which are just data types
ARGUMENT_LIST = { ( DATA_TYPE ~ ("," ~ DATA_TYPE)* )* }
// Definition of a probe
PROBE = {
PROBE_KEY
~ IDENTIFIER
~ LEFT_PAREN
~ ARGUMENT_LIST
~ RIGHT_PAREN
~ SEMICOLON
}
// Definition of a provider
PROVIDER = {
PROVIDER_KEY
~ IDENTIFIER
~ LEFT_BRACE
~ (PROBE)+
~ RIGHT_BRACE
~ SEMICOLON
}
PRAGMA = ${
"#pragma"
~ SPACE+
~ (!("\n") ~ ANY)*
~ SPACE*
~ "\n"
}
SPACE = _{ " " | "\t" }
// Files consist of providers and pragmas
FILE = {
SOI
~(
PROVIDER
| PRAGMA
)*
~EOI
}
WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
COMMENT = _{ "/*" ~ (!"*/" ~ ANY)* ~ "*/" }