1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
# frozen_string_literal: true
module Parser
# Holds p->max_numparam from parse.y
#
# @api private
class MaxNumparamStack
attr_reader :stack
ORDINARY_PARAMS = -1
def initialize
@stack = []
end
def empty?
@stack.size == 0
end
def has_ordinary_params!
set(ORDINARY_PARAMS)
end
def has_ordinary_params?
top == ORDINARY_PARAMS
end
def has_numparams?
top && top > 0
end
def register(numparam)
set( [top, numparam].max )
end
def top
@stack.last[:value]
end
def push(static:)
@stack.push(value: 0, static: static)
end
def pop
@stack.pop[:value]
end
private
def set(value)
@stack.last[:value] = value
end
end
end
|