rustycpp 0.1.6

An attempt to implement the C++20 standard. This is mostly to have fun & learn rust
use crate::grammars::defineast::{*};
use crate::utils::structs::{*};
use crate::preprocessor::pretoken::{*};
use std::sync::Arc;

grammar;

pub DefineStmt = <Define>;

#[inline]
Define: Vec<PreTokenDefine> = {
	Elem* => <>
};

Elem: PreTokenDefine = {
	<ReTokWhiteSp> => <>,
	<NoWhiteSp> => <>,
}

NoWhiteSp: PreTokenDefine = {
	<MaybeHashHash> => <>,
	<l:@L> Hash <r:@R> Whitespace* <a:MaybeHashHash> => {
		PreTokenDefine::Hash(
			FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: (), end: r.0}},
			vec![a])
	},
}

MaybeHashHash: PreTokenDefine = {
	<ArgMVar> => <>,
	<ReTokNoWhiteSp> => <>,
	<to:MaybeHashHash> <l:@L> HashHash <r:@R> Whitespace* <arg: ArgMVar> => {
		PreTokenDefine::HashHash(
			FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: (), end: r.0}},
			vec!(to), vec!(arg))
	},
	<to:MaybeHashHash> <l:@L> HashHash <r:@R> Whitespace* <arg: ReTokNoWhiteSp> => {
		PreTokenDefine::HashHash(
			FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: (), end: r.0}},
			vec!(to), vec!(arg))
	},
	Hash <l:@L> HashHash <r:@R> Whitespace* Hash => {
		PreTokenDefine::HashHash(
			FileTokPos{file: l.1.clone(), tokPos: TokPos {start: l.0, tok: (), end: r.0}},
				vec!(PreTokenDefine::Normal(
					FileTokPos{file: l.1.clone(), tokPos: TokPos {
						start: l.0, tok: PreToken::PreprocessingOperator(PreprocessingOperator::Hash), end: r.0
					}},
				)),
				vec!(PreTokenDefine::Normal(
					FileTokPos{file: l.1, tokPos: TokPos {
						start: l.0, tok: PreToken::PreprocessingOperator(PreprocessingOperator::Hash), end: r.0
					}},
				))
			)
	},
}

ArgMVar: PreTokenDefine = {
	<l:@L> <a:Arg> <r:@R> => PreTokenDefine::Arg(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: a, end: r.0}}),
	<l:@L> VariadicArg <r:@R> => PreTokenDefine::VariadicArg(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: (), end: r.0}}),
	<l:@L> VariadicOpt <r:@R> Whitespace* VariadicOptParenL <d:Define> VariadicOptParenR => {
		PreTokenDefine::VariadicOpt(
			FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: (), end: r.0}},
			d.into_iter().collect::<Vec<PreTokenDefine>>())
	},
}

ReTokNoWhiteSp: PreTokenDefine = {
	<l:@L> <t:HeaderName> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::HeaderName(t), end: r.0}}),
	<l:@L> <t:Ident> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::Ident(t), end: r.0}}),
	<l:@L> <t:PreprocessingOperator> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::PreprocessingOperator(t), end: r.0}}),
	<l:@L> <t:OperatorPunctuator> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::OperatorPunctuator(t), end: r.0}}),
	<l:@L> <t:Keyword> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::Keyword(t), end: r.0}}),
	<l:@L> <t:StringLiteral> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::StringLiteral(t), end: r.0}}),
	<l:@L> <t:UdStringLiteral> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::UdStringLiteral(t), end: r.0}}),
	<l:@L> <t:RawStringLiteral> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::RawStringLiteral(t), end: r.0}}),
	<l:@L> <t:CharLiteral> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::CharLiteral(t), end: r.0}}),
	<l:@L> <t:UdCharLiteral> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::UdCharLiteral(t), end: r.0}}),
	<l:@L> <t:PPNumber> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::PPNumber(t), end: r.0}}),
	<l:@L> <t:Unknown> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos {start: l.0, tok: PreToken::Unknown(t), end: r.0}}),
}

ReTokWhiteSp: PreTokenDefine = {
	<l:@L> <t:Whitespace> <r:@R> => PreTokenDefine::Normal(FileTokPos{file: l.1, tokPos: TokPos{start: l.0, tok: PreToken::Whitespace(t), end: r.0}}),
}

extern {
	type Location = (usize, Arc<CompileFile>);
	type Error = ();

	enum PreTokenDefinePreParse {
		HeaderName => PreTokenDefinePreParse::Normal(PreToken::HeaderName(<String>)),
		Ident => PreTokenDefinePreParse::Normal(PreToken::Ident(<String>)),
		PreprocessingOperator => PreTokenDefinePreParse::Normal(PreToken::PreprocessingOperator(<PreprocessingOperator>)),
		OperatorPunctuator => PreTokenDefinePreParse::Normal(PreToken::OperatorPunctuator(<&'static str>)),
		Keyword => PreTokenDefinePreParse::Normal(PreToken::Keyword(<&'static str>)),
		Newline => PreTokenDefinePreParse::Normal(PreToken::Newline),
		Whitespace => PreTokenDefinePreParse::Normal(PreToken::Whitespace(<WhiteCom>)),
		StringLiteral => PreTokenDefinePreParse::Normal(PreToken::StringLiteral(<String>)),
		UdStringLiteral => PreTokenDefinePreParse::Normal(PreToken::UdStringLiteral(<String>)),
		RawStringLiteral => PreTokenDefinePreParse::Normal(PreToken::RawStringLiteral(<String>)),
		CharLiteral => PreTokenDefinePreParse::Normal(PreToken::CharLiteral(<String>)),
		UdCharLiteral => PreTokenDefinePreParse::Normal(PreToken::UdCharLiteral(<String>)),
		PPNumber => PreTokenDefinePreParse::Normal(PreToken::PPNumber(<String>)),
		Unknown => PreTokenDefinePreParse::Normal(PreToken::Unknown(<String>)),
		Arg => PreTokenDefinePreParse::Arg(<String>),
		Hash => PreTokenDefinePreParse::Hash,
		HashHash => PreTokenDefinePreParse::HashHash,
		VariadicArg => PreTokenDefinePreParse::VariadicArg,
		VariadicOpt => PreTokenDefinePreParse::VariadicOpt,
		VariadicOptParenL => PreTokenDefinePreParse::VariadicOptParenL,
		VariadicOptParenR => PreTokenDefinePreParse::VariadicOptParenR,
	}
}