dtrace-parser 0.3.0

Parse DTrace provider definitions into Rust
Documentation
// A definition of the basic grammar of DTrace provider definitions.
// Copyright 2022 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" }
PTR_T = @{ "ptr" }
SIGNED_INT = ${ "int" ~ (BIT_WIDTH | PTR_T) ~ "_t" }
UNSIGNED_INT = ${ "uint" ~ (BIT_WIDTH | PTR_T) ~ "_t" }
INTEGER = ${ (SIGNED_INT | UNSIGNED_INT) }
STAR = ${ "*" }
INTEGER_POINTER = ${ INTEGER ~ STAR }
STRING = { "char" ~ STAR }
DATA_TYPE = { INTEGER_POINTER | INTEGER | STRING }

// 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)* ~ "*/" }