macro_rules! generate_terms {
($( $(#[ $attr:meta])* $typ:ident => $tok:expr ),*) => {
$(
$(#[ $attr])*
#[ derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct $typ;
impl <'a> $crate::Parse<' a> for $typ {
parser!(nom::combinator::value(
$typ,
crate ::whitespace::ws(
nom::bytes::complete::tag($tok)
)
));
}
)*
};
}
struct AlphaNumUnderscoreDash;
impl nom::FindToken<char> for AlphaNumUnderscoreDash {
fn find_token(&self , token: char) -> bool {
crate ::common::is_alphanum_underscore_dash(token)
}
}
pub (crate ) fn ident_tag(tag: &'static str) -> impl FnMut(&str) -> nom::IResult<&str, &str> {
move |input| {
nom::sequence::terminated(
nom::bytes::complete::tag(tag),
nom::combinator::not(nom::combinator::map_parser(
nom::bytes::complete::take(1 usize),
nom::bytes::complete::is_a(AlphaNumUnderscoreDash),
)),
)(input)
}
}
macro_rules! generate_terms_for_names {
($( $(#[ $attr:meta])* $typ:ident => $tok:expr,)*) => {
$(
$(#[ $attr])*
#[ derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct $typ;
impl <'a> $crate::Parse<' a> for $typ {
parser!(nom::combinator::value(
$typ,
$crate ::whitespace::ws($crate ::term::ident_tag($tok))
));
}
)*
};
}
generate_terms! {
/// Represents the terminal symbol `(`
OpenParen => "(" ,
/// Represents the terminal symbol `)`
CloseParen => ")" ,
/// Represents the terminal symbol `[`
OpenBracket => "[" ,
/// Represents the terminal symbol `]`
CloseBracket => "]" ,
/// Represents the terminal symbol `{`
OpenBrace => "{" ,
/// Represents the terminal symbol `}`
CloseBrace => "}" ,
/// Represents the terminal symbol `,`
Comma => "," ,
/// Represents the terminal symbol `-`
Minus => "-" ,
/// Represents the terminal symbol `.`
Dot => "." ,
/// Represents the terminal symbol `...`
Ellipsis => "..." ,
/// Represents the terminal symbol `:`
Colon => ":" ,
/// Represents the terminal symbol `;`
SemiColon => ";" ,
/// Represents the terminal symbol `<`
LessThan => "<" ,
/// Represents the terminal symbol `=`
Assign => "=" ,
/// Represents the terminal symbol `>`
GreaterThan => ">" ,
/// Represents the terminal symbol `?`
QMark => "?"
}
generate_terms_for_names! {
/// Represents the terminal symbol `or`
Or => "or" ,
/// Represents the terminal symbol `optional`
Optional => "optional" ,
/// Represents the terminal symbol `async`
Async => "async" ,
/// Represents the terminal symbol `attribute`
Attribute => "attribute" ,
/// Represents the terminal symbol `callback`
Callback => "callback" ,
/// Represents the terminal symbol `const`
Const => "const" ,
/// Represents the terminal symbol `deleter`
Deleter => "deleter" ,
/// Represents the terminal symbol `dictionary`
Dictionary => "dictionary" ,
/// Represents the terminal symbol `enum`
Enum => "enum" ,
/// Represents the terminal symbol `getter`
Getter => "getter" ,
/// Represents the terminal symbol `includes`
Includes => "includes" ,
/// Represents the terminal symbol `inherit`
Inherit => "inherit" ,
/// Represents the terminal symbol `interface`
Interface => "interface" ,
/// Represents the terminal symbol `iterable`
Iterable => "iterable" ,
/// Represents the terminal symbol `maplike`
Maplike => "maplike" ,
/// Represents the terminal symbol `namespace`
Namespace => "namespace" ,
/// Represents the terminal symbol `partial`
Partial => "partial" ,
/// Represents the terminal symbol `required`
Required => "required" ,
/// Represents the terminal symbol `setlike`
Setlike => "setlike" ,
/// Represents the terminal symbol `setter`
Setter => "setter" ,
/// Represents the terminal symbol `static`
Static => "static" ,
/// Represents the terminal symbol `stringifier`
Stringifier => "stringifier" ,
/// Represents the terminal symbol `typedef`
Typedef => "typedef" ,
/// Represents the terminal symbol `unrestricted`
Unrestricted => "unrestricted" ,
/// Represents the terminal symbol `symbol`
Symbol => "symbol" ,
/// Represents the terminal symbol `Infinity`
NegInfinity => "-Infinity" ,
/// Represents the terminal symbol `ByteString`
ByteString => "ByteString" ,
/// Represents the terminal symbol `DOMString`
DOMString => "DOMString" ,
/// Represents the terminal symbol `FrozenArray`
FrozenArray => "FrozenArray" ,
/// Represents the terminal symbol `Infinity`
Infinity => "Infinity" ,
/// Represents the terminal symbol `NaN`
NaN => "NaN" ,
/// Represents the terminal symbol `USVString`
USVString => "USVString" ,
/// Represents the terminal symbol `any`
Any => "any" ,
/// Represents the terminal symbol `boolean`
Boolean => "boolean" ,
/// Represents the terminal symbol `byte`
Byte => "byte" ,
/// Represents the terminal symbol `double`
Double => "double" ,
/// Represents the terminal symbol `false`
False => "false" ,
/// Represents the terminal symbol `float`
Float => "float" ,
/// Represents the terminal symbol `long`
Long => "long" ,
/// Represents the terminal symbol `null`
Null => "null" ,
/// Represents the terminal symbol `object`
Object => "object" ,
/// Represents the terminal symbol `octet`
Octet => "octet" ,
/// Represents the terminal symbol `sequence`
Sequence => "sequence" ,
/// Represents the terminal symbol `short`
Short => "short" ,
/// Represents the terminal symbol `true`
True => "true" ,
/// Represents the terminal symbol `unsigned`
Unsigned => "unsigned" ,
/// Represents the terminal symbol `undefined`
Undefined => "undefined" ,
/// Represents the terminal symbol `record`
Record => "record" ,
/// Represents the terminal symbol `ArrayBuffer`
ArrayBuffer => "ArrayBuffer" ,
/// Represents the terminal symbol `DataView`
DataView => "DataView" ,
/// Represents the terminal symbol `Int8Array`
Int8Array => "Int8Array" ,
/// Represents the terminal symbol `Int16Array`
Int16Array => "Int16Array" ,
/// Represents the terminal symbol `Int32Array`
Int32Array => "Int32Array" ,
/// Represents the terminal symbol `Uint8Array`
Uint8Array => "Uint8Array" ,
/// Represents the terminal symbol `Uint16Array`
Uint16Array => "Uint16Array" ,
/// Represents the terminal symbol `Uint32Array`
Uint32Array => "Uint32Array" ,
/// Represents the terminal symbol `Uint8ClampedArray`
Uint8ClampedArray => "Uint8ClampedArray" ,
/// Represents the terminal symbol `Float32Array`
Float32Array => "Float32Array" ,
/// Represents the terminal symbol `Float64Array`
Float64Array => "Float64Array" ,
/// Represents the terminal symbol `ArrayBufferView`
ArrayBufferView => "ArrayBufferView" ,
/// Represents the terminal symbol `BufferSource
BufferSource => "BufferSource" ,
/// Represents the terminal symbol `Promise`
Promise => "Promise" ,
/// Represents the terminal symbol `Error`
Error => "Error" ,
/// Represents the terminal symbol `readonly`
ReadOnly => "readonly" ,
/// Represents the terminal symbol `mixin`
Mixin => "mixin" ,
/// Represents the terminal symbol `implements`
Implements => "implements" ,
/// Represents the terminal symbol `legacycaller`
LegacyCaller => "legacycaller" ,
/// Represents the terminal symbol `constructor`
Constructor => "constructor" ,
}
#[ macro_export]
macro_rules! term {
(OpenParen) => {
$crate ::term::OpenParen
};
(CloseParen) => {
$crate ::term::CloseParen
};
(OpenBracket) => {
$crate ::term::OpenBracket
};
(CloseBracket) => {
$crate ::term::CloseBracket
};
(OpenBrace) => {
$crate ::term::OpenBrace
};
(CloseBrace) => {
$crate ::term::CloseBrace
};
(,) => {
$crate ::term::Comma
};
(-) => {
$crate ::term::Minus
};
(.) => {
$crate ::term::Dot
};
(...) => {
$crate ::term::Ellipsis
};
(:) => {
$crate ::term::Colon
};
(;) => {
$crate ::term::SemiColon
};
(<) => {
$crate ::term::LessThan
};
(=) => {
$crate ::term::Assign
};
(>) => {
$crate ::term::GreaterThan
};
(?) => {
$crate ::term::QMark
};
(or) => {
$crate ::term::Or
};
(optional) => {
$crate ::term::Optional
};
(async ) => {
$crate ::term::Async
};
(attribute) => {
$crate ::term::Attribute
};
(callback) => {
$crate ::term::Callback
};
(const ) => {
$crate ::term::Const
};
(deleter) => {
$crate ::term::Deleter
};
(dictionary) => {
$crate ::term::Dictionary
};
(enum ) => {
$crate ::term::Enum
};
(getter) => {
$crate ::term::Getter
};
(includes) => {
$crate ::term::Includes
};
(inherit) => {
$crate ::term::Inherit
};
(interface) => {
$crate ::term::Interface
};
(iterable) => {
$crate ::term::Iterable
};
(maplike) => {
$crate ::term::Maplike
};
(namespace) => {
$crate ::term::Namespace
};
(partial) => {
$crate ::term::Partial
};
(required) => {
$crate ::term::Required
};
(setlike) => {
$crate ::term::Setlike
};
(setter) => {
$crate ::term::Setter
};
(static ) => {
$crate ::term::Static
};
(stringifier) => {
$crate ::term::Stringifier
};
(typedef) => {
$crate ::term::Typedef
};
(unrestricted) => {
$crate ::term::Unrestricted
};
(symbol) => {
$crate ::term::Symbol
};
(- Infinity) => {
$crate ::term::NegInfinity
};
(ByteString) => {
$crate ::term::ByteString
};
(DOMString) => {
$crate ::term::DOMString
};
(FrozenArray) => {
$crate ::term::FrozenArray
};
(Infinity) => {
$crate ::term::Infinity
};
(NaN) => {
$crate ::term::NaN
};
(USVString) => {
$crate ::term::USVString
};
(any) => {
$crate ::term::Any
};
(boolean) => {
$crate ::term::Boolean
};
(byte) => {
$crate ::term::Byte
};
(double) => {
$crate ::term::Double
};
(false ) => {
$crate ::term::False
};
(float) => {
$crate ::term::Float
};
(long) => {
$crate ::term::Long
};
(null) => {
$crate ::term::Null
};
(object) => {
$crate ::term::Object
};
(octet) => {
$crate ::term::Octet
};
(sequence) => {
$crate ::term::Sequence
};
(short) => {
$crate ::term::Short
};
(true ) => {
$crate ::term::True
};
(unsigned) => {
$crate ::term::Unsigned
};
(undefined) => {
$crate ::term::Undefined
};
(record) => {
$crate ::term::Record
};
(ArrayBuffer) => {
$crate ::term::ArrayBuffer
};
(DataView) => {
$crate ::term::DataView
};
(Int8Array) => {
$crate ::term::Int8Array
};
(Int16Array) => {
$crate ::term::Int16Array
};
(Int32Array) => {
$crate ::term::Int32Array
};
(Uint8Array) => {
$crate ::term::Uint8Array
};
(Uint16Array) => {
$crate ::term::Uint16Array
};
(Uint32Array) => {
$crate ::term::Uint32Array
};
(Uint8ClampedArray) => {
$crate ::term::Uint8ClampedArray
};
(Float32Array) => {
$crate ::term::Float32Array
};
(Float64Array) => {
$crate ::term::Float64Array
};
(ArrayBufferView) => {
$crate ::term::ArrayBufferView
};
(BufferSource) => {
$crate ::term::BufferSource
};
(Promise) => {
$crate ::term::Promise
};
(Error) => {
$crate ::term::Error
};
(readonly) => {
$crate ::term::ReadOnly
};
(mixin) => {
$crate ::term::Mixin
};
(implements) => {
$crate ::term::Implements
};
(legacycaller) => {
$crate ::term::LegacyCaller
};
(constructor) => {
$crate ::term::Constructor
};
}
#[ cfg(test)]
mod test {
macro_rules! generate_tests {
($($m:ident, $typ:ident, $string:expr;)*) => {
$(
mod $m {
use super ::super ::$typ;
use crate ::Parse;
#[ test]
fn should_parse() {
let (rem, parsed) = $typ::parse(concat!($string)).unwrap();
assert_eq!(rem, "" );
assert_eq!(parsed, $typ);
}
#[ test]
fn should_parse_with_preceding_spaces() {
let (rem, parsed) = $typ::parse(concat!(" " , $string)).unwrap();
assert_eq!(rem, "" );
assert_eq!(parsed, $typ);
}
#[ test]
fn should_parse_with_succeeding_spaces() {
let (rem, parsed) = $typ::parse(concat!($string, " " )).unwrap();
assert_eq!(rem, "" );
assert_eq!(parsed, $typ);
}
#[ test]
fn should_parse_with_surrounding_spaces() {
let (rem, parsed) = $typ::parse(concat!(" " , $string, " " )).unwrap();
assert_eq!(rem, "" );
assert_eq!(parsed, $typ);
}
#[ test]
fn should_parse_if_anything_next() {
let (rem, parsed) = $typ::parse(concat!($string, " anything" )).unwrap();
assert_eq!(rem, "anything" );
assert_eq!(parsed, $typ);
}
}
)*
};
}
generate_tests![
openparen, OpenParen, "(" ;
closeparen, CloseParen, ")" ;
openbracket, OpenBracket, "[" ;
closebracket, CloseBracket, "]" ;
openbrace, OpenBrace, "{" ;
closebrace, CloseBrace, "}" ;
comma, Comma, "," ;
minus, Minus, "-" ;
dot, Dot, "." ;
ellipsis, Ellipsis, "..." ;
colon, Colon, ":" ;
semicolon, SemiColon, ";" ;
lessthan, LessThan, "<" ;
assign, Assign, "=" ;
greaterthan, GreaterThan, ">" ;
qmark, QMark, "?" ;
or, Or, "or" ;
optional, Optional, "optional" ;
async_, Async , "async" ;
attribute, Attribute, "attribute" ;
callback, Callback, "callback" ;
const_, Const , "const" ;
deleter, Deleter, "deleter" ;
dictionary, Dictionary, "dictionary" ;
enum_, Enum , "enum" ;
getter, Getter, "getter" ;
includes, Includes, "includes" ;
inherit, Inherit, "inherit" ;
interface, Interface, "interface" ;
iterable, Iterable, "iterable" ;
maplike, Maplike, "maplike" ;
namespace, Namespace, "namespace" ;
partial, Partial, "partial" ;
required, Required, "required" ;
setlike, Setlike, "setlike" ;
setter, Setter, "setter" ;
static_, Static , "static" ;
stringifier, Stringifier, "stringifier" ;
typedef, Typedef, "typedef" ;
unrestricted, Unrestricted, "unrestricted" ;
symbol, Symbol, "symbol" ;
neginfinity, NegInfinity, "-Infinity" ;
bytestring, ByteString, "ByteString" ;
domstring, DOMString, "DOMString" ;
frozenarray, FrozenArray, "FrozenArray" ;
infinity, Infinity, "Infinity" ;
nan, NaN, "NaN" ;
usvstring, USVString, "USVString" ;
any, Any, "any" ;
boolean, Boolean, "boolean" ;
byte, Byte, "byte" ;
double, Double, "double" ;
false_, False , "false" ;
float, Float, "float" ;
long, Long, "long" ;
null, Null, "null" ;
object, Object, "object" ;
octet, Octet, "octet" ;
sequence, Sequence, "sequence" ;
short, Short, "short" ;
true_, True , "true" ;
unsigned, Unsigned, "unsigned" ;
undefined, Undefined, "undefined" ;
record, Record, "record" ;
arraybuffer, ArrayBuffer, "ArrayBuffer" ;
dataview, DataView, "DataView" ;
int8array, Int8Array, "Int8Array" ;
int16array, Int16Array, "Int16Array" ;
int32array, Int32Array, "Int32Array" ;
uint8array, Uint8Array, "Uint8Array" ;
uint16array, Uint16Array, "Uint16Array" ;
uint32array, Uint32Array, "Uint32Array" ;
uint8clampedarray, Uint8ClampedArray, "Uint8ClampedArray" ;
float32array, Float32Array, "Float32Array" ;
float64array, Float64Array, "Float64Array" ;
promise, Promise, "Promise" ;
error, Error, "Error" ;
implements, Implements, "implements" ;
legacycaller, LegacyCaller, "legacycaller" ;
constructor, Constructor, "constructor" ;
];
}
Messung V0.5 in Prozent C=88 H=95 G=91
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-21)
¤
*© Formatika GbR, Deutschland