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,
}
}