%%
%%
%%
%%
%%
#[allow(non_camel_case_types)]
#[derive(Default)]
pub struct yyStackEntry {
stateno: YYACTIONTYPE,
major: YYCODETYPE,
minor: YYMINORTYPE,
}
#[allow(non_camel_case_types)]
pub struct yyParser<'input> {
yyidx: usize,
#[cfg(feature = "YYTRACKMAXSTACKDEPTH")]
yyhwm: usize,
yyerrcnt: i32,
%%
yystack: Vec<yyStackEntry>,
}
use std::cmp::Ordering;
use std::ops::Neg;
impl yyParser<'_> {
fn shift(&self, shift: i8) -> usize {
assert!(shift <= 1);
match shift.cmp(&0) {
Ordering::Equal => self.yyidx,
Ordering::Greater => self.yyidx + shift as usize,
Ordering::Less => self.yyidx.checked_sub(shift.neg() as usize).unwrap(),
}
}
fn yyidx_shift(&mut self, shift: i8) {
match shift.cmp(&0) {
Ordering::Greater => self.yyidx += shift as usize,
Ordering::Less => self.yyidx = self.yyidx.checked_sub(shift.neg() as usize).unwrap(),
Ordering::Equal => {}
}
}
fn yy_move(&mut self, shift: i8) -> yyStackEntry {
use std::mem::take;
let idx = self.shift(shift);
take(&mut self.yystack[idx])
}
fn push(&mut self, entry: yyStackEntry) {
if self.yyidx == self.yystack.len() {
self.yystack.push(entry);
} else {
self.yystack[self.yyidx] = entry;
}
}
}
use std::ops::{Index, IndexMut};
impl Index<i8> for yyParser<'_> {
type Output = yyStackEntry;
fn index(&self, shift: i8) -> &yyStackEntry {
let idx = self.shift(shift);
&self.yystack[idx]
}
}
impl IndexMut<i8> for yyParser<'_> {
fn index_mut(&mut self, shift: i8) -> &mut yyStackEntry {
let idx = self.shift(shift);
&mut self.yystack[idx]
}
}
#[cfg(not(feature = "NDEBUG"))]
use log::Level::Debug;
#[cfg(not(feature = "NDEBUG"))]
static TARGET: &str = "Parse";
#[cfg(any(feature = "YYCOVERAGE", not(feature = "NDEBUG")))]
%%
#[cfg(not(feature = "NDEBUG"))]
#[rustfmt::skip]
#[allow(non_upper_case_globals)]
static yyRuleName: [&str; YYNRULE] = [
%%
];
impl yyParser<'_> {
fn yy_grow_stack_if_needed(&mut self) -> bool {
if self.yyidx >= self.yystack.capacity() {
if self.yyGrowStack() {
self.yyidx = self.yyidx.checked_sub(1).unwrap();
self.yyStackOverflow();
return true;
}
}
false
}
fn yy_grow_stack_for_push(&mut self) -> bool {
if self.yyidx >= self.yystack.capacity() - 1 {
if self.yyGrowStack() {
self.yyStackOverflow();
return true;
}
}
if self.yyidx == self.yystack.len() {
self.yystack.push(yyStackEntry::default());
} else if self.yyidx + 1 == self.yystack.len() {
self.yystack.push(yyStackEntry::default());
}
false
}
#[allow(non_snake_case)]
#[cfg(feature = "YYSTACKDYNAMIC")]
fn yyGrowStack(&mut self) -> bool {
let capacity = self.yystack.capacity();
let additional = capacity + 100;
self.yystack.reserve(additional);
#[cfg(not(feature = "NDEBUG"))]
{
trace!(
target: TARGET,
"Stack grows from {} to {} entries.",
capacity,
self.yystack.capacity()
);
}
false
}
#[allow(non_snake_case)]
#[cfg(not(feature = "YYSTACKDYNAMIC"))]
fn yyGrowStack(&mut self) -> bool {
true
}
}
impl yyParser<'_> {
pub fn new(
%%
) -> yyParser {
let mut p = yyParser {
yyidx: 0,
#[cfg(feature = "YYTRACKMAXSTACKDEPTH")]
yyhwm: 0,
yystack: Vec::with_capacity(YYSTACKDEPTH),
yyerrcnt: -1,
%%
};
p.push(yyStackEntry::default());
p
}
}
impl yyParser<'_> {
fn yy_pop_parser_stack(&mut self) {
use std::mem::take;
let yytos = take(&mut self.yystack[self.yyidx]);
self.yyidx = self.yyidx.checked_sub(1).unwrap();
#[cfg(not(feature = "NDEBUG"))]
{
trace!(
target: TARGET,
"Popping {}", yyTokenName[yytos.major as usize]
);
}
}
}
impl yyParser<'_> {
#[allow(non_snake_case)]
pub fn ParseFinalize(&mut self) {
while self.yyidx > 0 {
self.yy_pop_parser_stack();
}
}
}
#[cfg(feature = "YYTRACKMAXSTACKDEPTH")]
impl yyParser<'_> {
#[allow(non_snake_case)]
pub fn ParseStackPeak(&self) -> usize {
self.yyhwm
}
fn yyhwm_incr(&mut self) {
if self.yyidx > self.yyhwm {
self.yyhwm += 1;
assert_eq!(self.yyhwm, self.yyidx);
}
}
}
#[cfg(not(feature = "YYTRACKMAXSTACKDEPTH"))]
impl yyParser<'_> {
#[inline]
fn yyhwm_incr(&mut self) {}
}
#[cfg(feature = "YYCOVERAGE")]
static yycoverage: [[bool; YYNTOKEN]; YYNSTATE] = [];
#[cfg(feature = "YYCOVERAGE")]
fn ParseCoverage() -> i32 {
let mut nMissed = 0;
return nMissed;
}
#[allow(non_snake_case)]
fn yy_find_shift_action(
mut iLookAhead: YYCODETYPE,
stateno: YYACTIONTYPE,
) -> YYACTIONTYPE {
if stateno > YY_MAX_SHIFT {
return stateno;
}
assert!(stateno <= YY_SHIFT_COUNT);
#[cfg(feature = "YYCOVERAGE")]
{
}
loop {
let mut i = yy_shift_ofst[stateno as usize] as usize;
assert!(i <= YY_ACTTAB_COUNT!());
assert!(i + usize::from(YYNTOKEN) <= yy_lookahead.len());
assert_ne!(iLookAhead, YYNOCODE);
assert!((iLookAhead as YYACTIONTYPE) < YYNTOKEN);
i += iLookAhead as usize;
if yy_lookahead[i] != iLookAhead {
if YYFALLBACK {
let iFallback = yyFallback[iLookAhead as usize];
if iFallback != 0 {
#[cfg(not(feature = "NDEBUG"))]
{
trace!(
target: TARGET,
"FALLBACK {} => {}",
yyTokenName[iLookAhead as usize],
yyTokenName[iFallback as usize]
);
}
assert_eq!(yyFallback[iFallback as usize], 0);
iLookAhead = iFallback;
continue;
}
}
if YYWILDCARD > 0 {
let j = i - iLookAhead as usize + YYWILDCARD as usize;
if yy_lookahead[j] == YYWILDCARD && iLookAhead > 0 {
#[cfg(not(feature = "NDEBUG"))]
{
trace!(
target: TARGET,
"WILDCARD {} => {}",
yyTokenName[iLookAhead as usize],
yyTokenName[YYWILDCARD as usize]
);
}
return yy_action[j];
}
}
return yy_default[stateno as usize];
} else {
return yy_action[i];
}
}
}
#[allow(non_snake_case)]
fn yy_find_reduce_action(
stateno: YYACTIONTYPE,
iLookAhead: YYCODETYPE,
) -> YYACTIONTYPE {
if YYERRORSYMBOL > 0 {
if stateno > YY_REDUCE_COUNT {
return yy_default[stateno as usize];
}
} else {
assert!(stateno <= YY_REDUCE_COUNT);
}
let mut i: i32 = yy_reduce_ofst[stateno as usize].into();
assert_ne!(iLookAhead, YYNOCODE);
i += i32::from(iLookAhead);
if YYERRORSYMBOL > 0 {
if !(0..YY_ACTTAB_COUNT!()).contains(&i) || yy_lookahead[i as usize] != iLookAhead {
return yy_default[stateno as usize];
}
} else {
assert!((0..YY_ACTTAB_COUNT!()).contains(&i));
assert_eq!(yy_lookahead[i as usize], iLookAhead);
}
yy_action[i as usize]
}
impl yyParser<'_> {
#[allow(non_snake_case)]
fn yyStackOverflow(&mut self) {
#[cfg(not(feature = "NDEBUG"))]
{
error!(target: TARGET, "Stack Overflow!");
}
while self.yyidx > 0 {
self.yy_pop_parser_stack();
}
%%
}
}
impl yyParser<'_> {
#[allow(non_snake_case)]
fn yyTraceShift(&self, yyNewState: YYACTIONTYPE, zTag: &str) {
#[cfg(not(feature = "NDEBUG"))]
{
let yytos = &self[0];
if yyNewState < YYNSTATE {
trace!(
target: TARGET,
"{} '{}', go to state {}", zTag, yyTokenName[yytos.major as usize], yyNewState
);
} else {
trace!(
target: TARGET,
"{} '{}', pending reduce {:?}",
zTag,
yyTokenName[yytos.major as usize],
yyNewState.checked_sub(YY_MIN_REDUCE)
);
}
}
}
}
impl yyParser<'_> {
#[allow(non_snake_case)]
fn yy_shift(
&mut self,
mut yyNewState: YYACTIONTYPE,
yyMajor: YYCODETYPE,
yyMinor: ParseTOKENTYPE,
) {
self.yyidx_shift(1);
self.yyhwm_incr();
if self.yy_grow_stack_if_needed() {
return;
}
if yyNewState > YY_MAX_SHIFT {
yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
}
let yytos = yyStackEntry {
stateno: yyNewState,
major: yyMajor,
minor: YYMINORTYPE::yy0(yyMinor),
};
self.push(yytos);
self.yyTraceShift(yyNewState, "Shift");
}
}
#[allow(non_upper_case_globals)]
static yyRuleInfoLhs: [YYCODETYPE; YYNRULE] = [
%%
];
#[allow(non_upper_case_globals)]
static yyRuleInfoNRhs: [i8; YYNRULE] = [
%%
];
impl yyParser<'_> {
fn yy_reduce(
&mut self,
yyruleno: YYACTIONTYPE,
yy_look_ahead: YYCODETYPE,
yy_lookahead_token: &ParseTOKENTYPE,
) -> Result<YYACTIONTYPE, ParseError> {
let _ = yy_look_ahead;
let _ = yy_lookahead_token;
let yylhsminor: YYMINORTYPE;
match yyruleno {
%%
};
let yygoto: YYCODETYPE = yyRuleInfoLhs[yyruleno as usize];
let yysize: i8 = yyRuleInfoNRhs[yyruleno as usize];
let yyact: YYACTIONTYPE = yy_find_reduce_action(self[yysize].stateno, yygoto);
assert!(!(yyact > YY_MAX_SHIFT && yyact <= YY_MAX_SHIFTREDUCE));
assert_ne!(yyact, YY_ERROR_ACTION);
self.yyidx_shift(yysize + 1);
{
let yymsp = &mut self[0];
yymsp.stateno = yyact;
yymsp.major = yygoto;
}
self.yyTraceShift(yyact, "... then shift");
Ok(yyact)
}
}
impl yyParser<'_> {
#[cfg(not(feature = "YYNOERRORRECOVERY"))]
fn yy_parse_failed(&mut self) {
#[cfg(not(feature = "NDEBUG"))]
{
error!(target: TARGET, "Fail!");
}
while self.yyidx > 0 {
self.yy_pop_parser_stack();
}
%%
}
#[cfg(feature = "YYNOERRORRECOVERY")]
fn yy_parse_failed(&mut self) {}
}
impl yyParser<'_> {
fn yy_syntax_error(
&mut self,
yymajor: YYCODETYPE,
yyminor: &ParseTOKENTYPE,
) {
%%
}
}
impl yyParser<'_> {
fn yy_accept(&mut self) {
#[cfg(not(feature = "NDEBUG"))]
{
trace!(target: TARGET, "Accept!");
}
if cfg!(not(feature = "YYNOERRORRECOVERY")) {
self.yyerrcnt = -1;
}
assert_eq!(self.yyidx, 0);
%%
}
}
impl yyParser<'_> {
#[allow(non_snake_case)]
pub fn Parse(
&mut self,
yymajor: TokenType,
mut yyminor: ParseTOKENTYPE,
) -> Result<(), ParseError> {
let mut yymajor = yymajor as YYCODETYPE;
let mut yyendofinput: bool = false;
let mut yyerrorhit: bool = false;
if YYERRORSYMBOL == 0 && cfg!(not(feature = "YYNOERRORRECOVERY")) {
yyendofinput = yymajor == 0;
}
let mut yyact: YYACTIONTYPE = self[0].stateno;
#[cfg(not(feature = "NDEBUG"))]
{
if yyact < YY_MIN_REDUCE {
trace!(
target: TARGET,
"Input '{}' in state {}", yyTokenName[yymajor as usize], yyact
);
} else {
trace!(
target: TARGET,
"Input '{}' with pending reduce {}",
yyTokenName[yymajor as usize],
yyact - YY_MIN_REDUCE
);
}
}
loop {
assert_eq!(yyact, self[0].stateno);
yyact = yy_find_shift_action(yymajor, yyact);
if yyact >= YY_MIN_REDUCE {
let yyruleno = yyact - YY_MIN_REDUCE;
#[cfg(not(feature = "NDEBUG"))]
{
assert!((yyruleno as usize) < yyRuleName.len());
let yysize = yyRuleInfoNRhs[yyruleno as usize];
let action = if yyruleno < YYNRULE_WITH_ACTION {
""
} else {
" without external action"
};
if yysize != 0 {
trace!(
target: TARGET,
"Reduce {} [{}]{}, pop back to state {}.",
yyruleno,
yyRuleName[yyruleno as usize],
action,
self[yysize].stateno
);
} else {
trace!(
target: TARGET,
"Reduce {} [{}]{}.", yyruleno, yyRuleName[yyruleno as usize], action
);
}
}
if yyRuleInfoNRhs[yyruleno as usize] == 0 {
self.yyhwm_incr();
if self.yy_grow_stack_for_push() {
break;
}
}
yyact = self.yy_reduce(yyruleno, yymajor, &yyminor)?;
} else if yyact <= YY_MAX_SHIFTREDUCE {
self.yy_shift(yyact, yymajor, yyminor.take());
if cfg!(not(feature = "YYNOERRORRECOVERY")) {
self.yyerrcnt -= 1;
}
break;
} else if yyact == YY_ACCEPT_ACTION {
self.yyidx_shift(-1);
self.yy_accept();
return Ok(());
} else {
assert_eq!(yyact, YY_ERROR_ACTION);
#[cfg(not(feature = "NDEBUG"))]
{
trace!(target: TARGET, "Syntax Error!");
}
if YYERRORSYMBOL > 0 {
if self.yyerrcnt < 0 {
self.yy_syntax_error(yymajor, &yyminor);
}
let yymx = self[0].major;
if yymx == YYERRORSYMBOL || yyerrorhit {
#[cfg(not(feature = "NDEBUG"))]
{
trace!(
target: TARGET,
"Discard input token {}", yyTokenName[yymajor as usize]
);
}
yymajor = YYNOCODE;
} else {
while self.yyidx > 0 {
yyact = yy_find_reduce_action(self[0].stateno, YYERRORSYMBOL);
if yyact <= YY_MAX_SHIFTREDUCE {
break;
}
self.yy_pop_parser_stack();
}
if self.yyidx <= 0 || yymajor == 0 {
self.yy_parse_failed();
if cfg!(not(feature = "YYNOERRORRECOVERY")) {
self.yyerrcnt = -1;
}
yymajor = YYNOCODE;
} else if yymx != YYERRORSYMBOL {
self.yy_shift(yyact, YYERRORSYMBOL, yyminor.take());
}
}
self.yyerrcnt = 3;
yyerrorhit = true;
if yymajor == YYNOCODE {
break;
}
yyact = self[0].stateno;
} else if cfg!(feature = "YYNOERRORRECOVERY") {
self.yy_syntax_error(yymajor, &yyminor);
break;
} else {
if self.yyerrcnt <= 0 {
self.yy_syntax_error(yymajor, &yyminor);
}
self.yyerrcnt = 3;
if yyendofinput {
self.yy_parse_failed();
if cfg!(not(feature = "YYNOERRORRECOVERY")) {
self.yyerrcnt = -1;
}
}
break;
}
}
if self.yyidx <= 0 {
break;
}
}
#[cfg(not(feature = "NDEBUG"))]
{
if log_enabled!(target: TARGET, Debug) {
let msg = self.yystack[1..=self.yyidx]
.iter()
.map(|entry| yyTokenName[entry.major as usize])
.collect::<Vec<&str>>()
.join(" ");
trace!(target: TARGET, "Return. Stack=[{}]", msg);
}
}
return Ok(());
}
pub fn parse_fallback(i_token: YYCODETYPE) -> YYCODETYPE {
if YYFALLBACK {
return yyFallback[i_token as usize];
}
0
}
}