dtrace-parser 0.1.9

Parse DTrace provider definitions into Rust
Documentation
// 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)* ~ "*/" }