Source for file Parser.php
Documentation is available at Parser.php
/* Driver template for the PHP_PHP_LexerGenerator_Regex_rGenerator parser generator. (PHP port of LEMON)
* This can be used to store both the string representation of
* a token, and any useful meta-data associated with the token.
* meta-data should be stored as an array
$value->metadata : $value;
$this->metadata[$offset] = $value->metadata;
/** The following structure represents a single element of the
* parser's stack. Information stored includes:
* + The state number for the parser at this level of the stack.
* + The value of the token stored at this level of the stack.
* (In other words, the "major" token.)
* + The semantic value stored at this level of the stack. This is
* the information used by the action routines in the grammar.
* It is sometimes called the "minor" token.
public $major; /* The major token value. This is the code
** number for the token at this stack level */
public $minor; /* The user-supplied minor token value. This
** is the value of the token */
// code external to the class is included here
require_once 'PHP/LexerGenerator/Exception.php';
// declare_class is output here
/* First off, code is included which follows the "include_class" declaration
$this->_patternIndex = 1;
function reset($patternIndex, $updatePattern = false)
$this->_updatePattern = $updatePattern;
$this->_patternIndex = $patternIndex;
/* Next is all token values, as class constants
** These constants (all generated automatically by the parser generator)
** specify the various kinds of tokens (terminals) that the parser
** Each symbol here is a terminal symbol in the grammar.
const CLOSECHARCLASS = 8;
const ESCAPEDBACKSLASH = 12;
const BACKREFERENCE = 14;
const COULDBEBACKREF = 15;
const INTERNALOPTIONS = 17;
const POSITIVELOOKAHEAD = 20;
const NEGATIVELOOKAHEAD = 21;
const POSITIVELOOKBEHIND = 22;
const NEGATIVELOOKBEHIND = 23;
const YY_NO_ACTION = 252;
const YY_ACCEPT_ACTION = 251;
const YY_ERROR_ACTION = 250;
/* Next are that tables used to determine what action to take based on the
** current state and lookahead token. These tables are used to implement
** functions that take a state number and lookahead value and return an
** Suppose the action integer is N. Then the action is determined as
** 0 <= N < self::YYNSTATE Shift N. That is,
** self::YYNSTATE <= N < self::YYNSTATE+self::YYNRULE Reduce by rule N-YYNSTATE.
** N == self::YYNSTATE+self::YYNRULE A syntax error has occurred.
** N == self::YYNSTATE+self::YYNRULE+1 The parser accepts its
** input. (and concludes parsing)
** N == self::YYNSTATE+self::YYNRULE+2 No such action. Denotes unused
** slots in the yy_action[] table.
** The action table is constructed as a single large static array $yy_action.
** Given state S and lookahead X, the action is computed as
** self::$yy_action[self::$yy_shift_ofst[S] + X ]
** If the index value self::$yy_shift_ofst[S]+X is out of range or if the value
** self::$yy_lookahead[self::$yy_shift_ofst[S]+X] is not equal to X or if
** self::$yy_shift_ofst[S] is equal to self::YY_SHIFT_USE_DFLT, it means that
** the action is not in the table and that self::$yy_default[S] should be used instead.
** The formula above is for computing the action when the lookahead is
** a terminal symbol. If the lookahead is a non-terminal (as occurs after
** a reduce action) then the static $yy_reduce_ofst array is used in place of
** the static $yy_shift_ofst array and self::YY_REDUCE_USE_DFLT is used in place of
** self::YY_SHIFT_USE_DFLT.
** The following are the tables generated in this section:
** self::$yy_action A single table containing all actions.
** self::$yy_lookahead A table containing the lookahead for each entry in
** yy_action. Used to detect hash collisions.
** self::$yy_shift_ofst For each state, the offset into self::$yy_action for
** self::$yy_reduce_ofst For each state, the offset into self::$yy_action for
** shifting non-terminals after a reduce.
** self::$yy_default Default action for each state.
const YY_SZ_ACTTAB = 367;
/* 0 */ 251, 50, 16, 21, 128, 129, 141, 140, 139, 142,
/* 10 */ 143, 145, 144, 138, 41, 16, 21, 128, 129, 141,
/* 20 */ 140, 139, 142, 143, 145, 144, 138, 43, 16, 21,
/* 30 */ 128, 129, 141, 140, 139, 142, 143, 145, 144, 138,
/* 40 */ 98, 16, 21, 128, 129, 141, 140, 139, 142, 143,
/* 50 */ 145, 144, 138, 32, 16, 21, 128, 129, 141, 140,
/* 60 */ 139, 142, 143, 145, 144, 138, 39, 16, 21, 128,
/* 70 */ 129, 141, 140, 139, 142, 143, 145, 144, 138, 31,
/* 80 */ 16, 21, 128, 129, 141, 140, 139, 142, 143, 145,
/* 90 */ 144, 138, 42, 16, 21, 128, 129, 141, 140, 139,
/* 100 */ 142, 143, 145, 144, 138, 29, 16, 21, 128, 129,
/* 110 */ 141, 140, 139, 142, 143, 145, 144, 138, 35, 16,
/* 120 */ 21, 128, 129, 141, 140, 139, 142, 143, 145, 144,
/* 130 */ 138, 40, 16, 21, 128, 129, 141, 140, 139, 142,
/* 140 */ 143, 145, 144, 138, 37, 16, 21, 128, 129, 141,
/* 150 */ 140, 139, 142, 143, 145, 144, 138, 38, 16, 21,
/* 160 */ 128, 129, 141, 140, 139, 142, 143, 145, 144, 138,
/* 170 */ 36, 16, 21, 128, 129, 141, 140, 139, 142, 143,
/* 180 */ 145, 144, 138, 15, 21, 128, 129, 141, 140, 139,
/* 190 */ 142, 143, 145, 144, 138, 54, 24, 23, 78, 75,
/* 200 */ 76, 82, 83, 89, 88, 87, 84, 86, 112, 115,
/* 210 */ 114, 34, 11, 1, 7, 8, 4, 2, 3, 13,
/* 220 */ 52, 60, 10, 17, 102, 108, 14, 55, 18, 96,
/* 230 */ 11, 47, 61, 48, 124, 46, 49, 51, 10, 17,
/* 240 */ 106, 11, 11, 97, 18, 44, 103, 47, 61, 48,
/* 250 */ 56, 46, 49, 51, 10, 17, 58, 132, 117, 111,
/* 260 */ 18, 119, 12, 47, 61, 48, 122, 46, 49, 51,
/* 270 */ 10, 17, 7, 8, 4, 2, 18, 28, 11, 47,
/* 280 */ 61, 48, 135, 46, 49, 51, 116, 137, 65, 127,
/* 290 */ 64, 63, 73, 79, 113, 120, 68, 70, 71, 11,
/* 300 */ 67, 66, 69, 62, 26, 64, 63, 73, 99, 113,
/* 310 */ 120, 19, 72, 74, 59, 126, 92, 80, 72, 74,
/* 320 */ 59, 11, 92, 80, 123, 121, 118, 131, 93, 100,
/* 330 */ 130, 136, 133, 11, 11, 11, 53, 11, 11, 11,
/* 340 */ 6, 9, 107, 125, 110, 146, 33, 81, 57, 91,
/* 350 */ 104, 85, 105, 94, 45, 27, 95, 101, 25, 109,
/* 360 */ 134, 30, 5, 77, 20, 22, 90,
/* 0 */ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
/* 10 */ 39, 40, 41, 42, 30, 31, 32, 33, 34, 35,
/* 20 */ 36, 37, 38, 39, 40, 41, 42, 30, 31, 32,
/* 30 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
/* 40 */ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
/* 50 */ 40, 41, 42, 30, 31, 32, 33, 34, 35, 36,
/* 60 */ 37, 38, 39, 40, 41, 42, 30, 31, 32, 33,
/* 70 */ 34, 35, 36, 37, 38, 39, 40, 41, 42, 30,
/* 80 */ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
/* 90 */ 41, 42, 30, 31, 32, 33, 34, 35, 36, 37,
/* 100 */ 38, 39, 40, 41, 42, 30, 31, 32, 33, 34,
/* 110 */ 35, 36, 37, 38, 39, 40, 41, 42, 30, 31,
/* 120 */ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
/* 130 */ 42, 30, 31, 32, 33, 34, 35, 36, 37, 38,
/* 140 */ 39, 40, 41, 42, 30, 31, 32, 33, 34, 35,
/* 150 */ 36, 37, 38, 39, 40, 41, 42, 30, 31, 32,
/* 160 */ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
/* 170 */ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
/* 180 */ 40, 41, 42, 31, 32, 33, 34, 35, 36, 37,
/* 190 */ 38, 39, 40, 41, 42, 1, 2, 32, 33, 34,
/* 200 */ 35, 36, 37, 38, 39, 40, 41, 42, 10, 11,
/* 210 */ 12, 17, 3, 19, 20, 21, 22, 23, 24, 25,
/* 220 */ 26, 27, 1, 2, 10, 11, 5, 18, 7, 18,
/* 230 */ 3, 10, 11, 12, 4, 14, 15, 16, 1, 2,
/* 240 */ 4, 3, 3, 6, 7, 18, 4, 10, 11, 12,
/* 250 */ 10, 14, 15, 16, 1, 2, 18, 18, 4, 6,
/* 260 */ 7, 18, 19, 10, 11, 12, 4, 14, 15, 16,
/* 270 */ 1, 2, 20, 21, 22, 23, 7, 13, 3, 10,
/* 280 */ 11, 12, 4, 14, 15, 16, 10, 11, 8, 4,
/* 290 */ 10, 11, 12, 18, 14, 15, 10, 11, 12, 3,
/* 300 */ 14, 15, 16, 8, 13, 10, 11, 12, 18, 14,
/* 310 */ 15, 9, 10, 11, 12, 4, 14, 15, 10, 11,
/* 320 */ 12, 3, 14, 15, 10, 11, 12, 10, 11, 12,
/* 330 */ 10, 11, 12, 3, 3, 3, 18, 3, 3, 3,
/* 340 */ 36, 37, 4, 4, 4, 4, 13, 4, 18, 18,
/* 350 */ 18, 4, 18, 18, 18, 13, 4, 4, 13, 4,
/* 360 */ 4, 13, 18, 4, 43, 43, 4,
const YY_SHIFT_USE_DFLT = - 1;
/* 0 */ 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
/* 10 */ 221, 221, 221, 221, 269, 237, 253, 194, 302, 308,
/* 20 */ 280, 286, 295, 286, 252, 320, 317, 198, 314, 336,
/* 30 */ 276, 239, 335, 214, 243, 332, 330, 318, 334, 275,
/* 40 */ 209, 227, 331, 238, 362, 359, 230, 278, 262, 285,
/* 50 */ 296, 311, 211, 254, 240, 356, 344, 353, 347, 333,
/* 60 */ 290, 341, 340, 345, 342, 339, 343, 355, 352, 338,
/* 70 */ 236, 242, 264, 348, 291,
const YY_REDUCE_USE_DFLT = - 30;
const YY_REDUCE_MAX = 19;
/* 0 */ - 29, 101, 127, 140, 88, - 3, - 16, 36, 62, 75,
/* 10 */ 114, 10, 49, 23, 152, 165, 165, 304, 322, 321,
/* 0 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 1 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 2 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 3 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 4 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 5 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 6 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 7 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 8 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 9 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 10 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 11 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 12 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 13 */ array(1, 2, 5, 7, 10, 11, 12, 14, 15, 16, ),
/* 14 */ array(1, 2, 7, 10, 11, 12, 14, 15, 16, ),
/* 15 */ array(1, 2, 6, 7, 10, 11, 12, 14, 15, 16, ),
/* 16 */ array(1, 2, 6, 7, 10, 11, 12, 14, 15, 16, ),
/* 17 */ array(1, 2, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, ),
/* 18 */ array(9, 10, 11, 12, 14, 15, ),
/* 19 */ array(10, 11, 12, 14, 15, ),
/* 20 */ array(8, 10, 11, 12, 14, 15, ),
/* 21 */ array(10, 11, 12, 14, 15, 16, ),
/* 22 */ array(8, 10, 11, 12, 14, 15, ),
/* 23 */ array(10, 11, 12, 14, 15, 16, ),
/* 24 */ array(20, 21, 22, 23, ),
/* 25 */ array(10, 11, 12, ),
/* 26 */ array(10, 11, 12, ),
/* 27 */ array(10, 11, 12, ),
/* 28 */ array(10, 11, 12, ),
/* 30 */ array(10, 11, ),
/* 33 */ array(10, 11, ),
/* 34 */ array(18, 19, ),
/* 0 */ 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
/* 10 */ 250, 250, 250, 250, 250, 149, 151, 250, 250, 250,
/* 20 */ 250, 153, 250, 164, 250, 250, 250, 250, 250, 250,
/* 30 */ 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
/* 40 */ 250, 250, 250, 250, 235, 237, 213, 205, 211, 215,
/* 50 */ 147, 207, 250, 245, 250, 231, 250, 243, 234, 181,
/* 60 */ 250, 209, 175, 192, 194, 176, 227, 225, 217, 219,
/* 70 */ 221, 223, 179, 193, 180, 166, 167, 238, 165, 239,
/* 80 */ 191, 228, 168, 169, 173, 233, 174, 172, 171, 170,
/* 90 */ 236, 240, 190, 184, 247, 218, 248, 148, 152, 249,
/* 100 */ 183, 244, 185, 224, 241, 242, 222, 220, 182, 226,
/* 110 */ 177, 150, 202, 203, 201, 200, 199, 246, 189, 229,
/* 120 */ 204, 188, 212, 187, 214, 178, 208, 216, 154, 155,
/* 130 */ 198, 186, 230, 197, 232, 206, 195, 196, 163, 158,
/* 140 */ 157, 156, 159, 160, 162, 161, 210,
/* The next thing included is series of defines which control
** various aspects of the generated parser.
** self::YYNOCODE is a number which corresponds
** to no legal terminal or nonterminal number. This
** number is used to fill in empty slots of the hash
** self::YYFALLBACK If defined, this indicates that one or more tokens
** have fall-back values which should be used if the
** original value of the token will not parse.
** self::YYSTACKDEPTH is the maximum depth of the parser's stack.
** self::YYNSTATE the combined number of states.
** self::YYNRULE the number of rules in the grammar
** self::YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing.
const YYSTACKDEPTH = 100;
const YYERRORSYMBOL = 28;
const YYERRSYMDT = 'yy0';
/** The next table maps tokens into fallback tokens. If a construct
* appears in the grammer, then ID becomes a fallback token for X, Y,
* and Z. Whenever one of the tokens X, Y, or Z is input to the parser
* but it does not parse, the type of the token is changed to ID and
* the parse is retried before an error is thrown.
* Turn parser tracing on by giving a stream to which to write the trace
* and a prompt to preface each trace message. Tracing is turned off
* by making either argument NULL
* - A stream resource to which trace output should be written.
* If NULL, then tracing is turned off.
* - A prefix string written at the beginning of every
* line of trace output. If NULL, then tracing is
static function Trace($TraceFILE, $zTracePrompt)
} elseif (!$zTracePrompt) {
self::$yyTraceFILE = $TraceFILE;
self::$yyTracePrompt = $zTracePrompt;
* Output debug information to output (php://output stream)
self::$yyTraceFILE = fopen('php://output', 'w');
self::$yyTracePrompt = '';
* String to prepend to debug output
public $yyidx; /* Index of top element in stack */
public $yyerrcnt; /* Shifts left before out of the error */
public $yystack = array(); /* The parser's stack */
* For tracing shifts, the names of all terminals and nonterminals
* are required. The following table supplies these names
'$', 'OPENPAREN', 'OPENASSERTION', 'BAR',
'MULTIPLIER', 'MATCHSTART', 'MATCHEND', 'OPENCHARCLASS',
'CLOSECHARCLASS', 'NEGATE', 'TEXT', 'CONTROLCHAR',
'ESCAPEDBACKSLASH', 'HYPHEN', 'BACKREFERENCE', 'COULDBEBACKREF',
'FULLSTOP', 'INTERNALOPTIONS', 'CLOSEPAREN', 'COLON',
'POSITIVELOOKAHEAD', 'NEGATIVELOOKAHEAD', 'POSITIVELOOKBEHIND', 'NEGATIVELOOKBEHIND',
'PATTERNNAME', 'ONCEONLY', 'COMMENT', 'RECUR',
'error', 'start', 'pattern', 'basic_pattern',
'basic_text', 'character_class', 'assertion', 'grouping',
'lookahead', 'lookbehind', 'subpattern', 'onceonly',
'comment', 'recur', 'conditional', 'character_class_contents',
* For tracing reduce actions, the names of all rules are required.
/* 0 */ "start ::= pattern",
/* 1 */ "pattern ::= MATCHSTART basic_pattern MATCHEND",
/* 2 */ "pattern ::= MATCHSTART basic_pattern",
/* 3 */ "pattern ::= basic_pattern MATCHEND",
/* 4 */ "pattern ::= basic_pattern",
/* 5 */ "pattern ::= pattern BAR pattern",
/* 6 */ "basic_pattern ::= basic_text",
/* 7 */ "basic_pattern ::= character_class",
/* 8 */ "basic_pattern ::= assertion",
/* 9 */ "basic_pattern ::= grouping",
/* 10 */ "basic_pattern ::= lookahead",
/* 11 */ "basic_pattern ::= lookbehind",
/* 12 */ "basic_pattern ::= subpattern",
/* 13 */ "basic_pattern ::= onceonly",
/* 14 */ "basic_pattern ::= comment",
/* 15 */ "basic_pattern ::= recur",
/* 16 */ "basic_pattern ::= conditional",
/* 17 */ "basic_pattern ::= basic_pattern basic_text",
/* 18 */ "basic_pattern ::= basic_pattern character_class",
/* 19 */ "basic_pattern ::= basic_pattern assertion",
/* 20 */ "basic_pattern ::= basic_pattern grouping",
/* 21 */ "basic_pattern ::= basic_pattern lookahead",
/* 22 */ "basic_pattern ::= basic_pattern lookbehind",
/* 23 */ "basic_pattern ::= basic_pattern subpattern",
/* 24 */ "basic_pattern ::= basic_pattern onceonly",
/* 25 */ "basic_pattern ::= basic_pattern comment",
/* 26 */ "basic_pattern ::= basic_pattern recur",
/* 27 */ "basic_pattern ::= basic_pattern conditional",
/* 28 */ "character_class ::= OPENCHARCLASS character_class_contents CLOSECHARCLASS",
/* 29 */ "character_class ::= OPENCHARCLASS NEGATE character_class_contents CLOSECHARCLASS",
/* 30 */ "character_class ::= OPENCHARCLASS character_class_contents CLOSECHARCLASS MULTIPLIER",
/* 31 */ "character_class ::= OPENCHARCLASS NEGATE character_class_contents CLOSECHARCLASS MULTIPLIER",
/* 32 */ "character_class_contents ::= TEXT",
/* 33 */ "character_class_contents ::= CONTROLCHAR",
/* 34 */ "character_class_contents ::= ESCAPEDBACKSLASH",
/* 35 */ "character_class_contents ::= ESCAPEDBACKSLASH HYPHEN CONTROLCHAR",
/* 36 */ "character_class_contents ::= CONTROLCHAR HYPHEN ESCAPEDBACKSLASH",
/* 37 */ "character_class_contents ::= CONTROLCHAR HYPHEN CONTROLCHAR",
/* 38 */ "character_class_contents ::= ESCAPEDBACKSLASH HYPHEN TEXT",
/* 39 */ "character_class_contents ::= CONTROLCHAR HYPHEN TEXT",
/* 40 */ "character_class_contents ::= TEXT HYPHEN TEXT",
/* 41 */ "character_class_contents ::= TEXT HYPHEN CONTROLCHAR",
/* 42 */ "character_class_contents ::= TEXT HYPHEN ESCAPEDBACKSLASH",
/* 43 */ "character_class_contents ::= BACKREFERENCE",
/* 44 */ "character_class_contents ::= COULDBEBACKREF",
/* 45 */ "character_class_contents ::= character_class_contents CONTROLCHAR",
/* 46 */ "character_class_contents ::= character_class_contents ESCAPEDBACKSLASH",
/* 47 */ "character_class_contents ::= character_class_contents TEXT",
/* 48 */ "character_class_contents ::= character_class_contents CONTROLCHAR HYPHEN CONTROLCHAR",
/* 49 */ "character_class_contents ::= character_class_contents ESCAPEDBACKSLASH HYPHEN CONTROLCHAR",
/* 50 */ "character_class_contents ::= character_class_contents CONTROLCHAR HYPHEN ESCAPEDBACKSLASH",
/* 51 */ "character_class_contents ::= character_class_contents CONTROLCHAR HYPHEN TEXT",
/* 52 */ "character_class_contents ::= character_class_contents ESCAPEDBACKSLASH HYPHEN TEXT",
/* 53 */ "character_class_contents ::= character_class_contents TEXT HYPHEN CONTROLCHAR",
/* 54 */ "character_class_contents ::= character_class_contents TEXT HYPHEN ESCAPEDBACKSLASH",
/* 55 */ "character_class_contents ::= character_class_contents TEXT HYPHEN TEXT",
/* 56 */ "character_class_contents ::= character_class_contents BACKREFERENCE",
/* 57 */ "character_class_contents ::= character_class_contents COULDBEBACKREF",
/* 58 */ "basic_text ::= TEXT",
/* 59 */ "basic_text ::= TEXT MULTIPLIER",
/* 60 */ "basic_text ::= FULLSTOP",
/* 61 */ "basic_text ::= FULLSTOP MULTIPLIER",
/* 62 */ "basic_text ::= CONTROLCHAR",
/* 63 */ "basic_text ::= CONTROLCHAR MULTIPLIER",
/* 64 */ "basic_text ::= ESCAPEDBACKSLASH",
/* 65 */ "basic_text ::= ESCAPEDBACKSLASH MULTIPLIER",
/* 66 */ "basic_text ::= BACKREFERENCE",
/* 67 */ "basic_text ::= BACKREFERENCE MULTIPLIER",
/* 68 */ "basic_text ::= COULDBEBACKREF",
/* 69 */ "basic_text ::= COULDBEBACKREF MULTIPLIER",
/* 70 */ "basic_text ::= basic_text TEXT",
/* 71 */ "basic_text ::= basic_text TEXT MULTIPLIER",
/* 72 */ "basic_text ::= basic_text FULLSTOP",
/* 73 */ "basic_text ::= basic_text FULLSTOP MULTIPLIER",
/* 74 */ "basic_text ::= basic_text CONTROLCHAR",
/* 75 */ "basic_text ::= basic_text CONTROLCHAR MULTIPLIER",
/* 76 */ "basic_text ::= basic_text ESCAPEDBACKSLASH",
/* 77 */ "basic_text ::= basic_text ESCAPEDBACKSLASH MULTIPLIER",
/* 78 */ "basic_text ::= basic_text BACKREFERENCE",
/* 79 */ "basic_text ::= basic_text BACKREFERENCE MULTIPLIER",
/* 80 */ "basic_text ::= basic_text COULDBEBACKREF",
/* 81 */ "basic_text ::= basic_text COULDBEBACKREF MULTIPLIER",
/* 82 */ "assertion ::= OPENASSERTION INTERNALOPTIONS CLOSEPAREN",
/* 83 */ "assertion ::= OPENASSERTION INTERNALOPTIONS COLON pattern CLOSEPAREN",
/* 84 */ "grouping ::= OPENASSERTION COLON pattern CLOSEPAREN",
/* 85 */ "grouping ::= OPENASSERTION COLON pattern CLOSEPAREN MULTIPLIER",
/* 86 */ "conditional ::= OPENASSERTION OPENPAREN TEXT CLOSEPAREN pattern CLOSEPAREN MULTIPLIER",
/* 87 */ "conditional ::= OPENASSERTION OPENPAREN TEXT CLOSEPAREN pattern CLOSEPAREN",
/* 88 */ "conditional ::= OPENASSERTION lookahead pattern CLOSEPAREN",
/* 89 */ "conditional ::= OPENASSERTION lookahead pattern CLOSEPAREN MULTIPLIER",
/* 90 */ "conditional ::= OPENASSERTION lookbehind pattern CLOSEPAREN",
/* 91 */ "conditional ::= OPENASSERTION lookbehind pattern CLOSEPAREN MULTIPLIER",
/* 92 */ "lookahead ::= OPENASSERTION POSITIVELOOKAHEAD pattern CLOSEPAREN",
/* 93 */ "lookahead ::= OPENASSERTION NEGATIVELOOKAHEAD pattern CLOSEPAREN",
/* 94 */ "lookbehind ::= OPENASSERTION POSITIVELOOKBEHIND pattern CLOSEPAREN",
/* 95 */ "lookbehind ::= OPENASSERTION NEGATIVELOOKBEHIND pattern CLOSEPAREN",
/* 96 */ "subpattern ::= OPENASSERTION PATTERNNAME pattern CLOSEPAREN",
/* 97 */ "subpattern ::= OPENASSERTION PATTERNNAME pattern CLOSEPAREN MULTIPLIER",
/* 98 */ "subpattern ::= OPENPAREN pattern CLOSEPAREN",
/* 99 */ "subpattern ::= OPENPAREN pattern CLOSEPAREN MULTIPLIER",
/* 100 */ "onceonly ::= OPENASSERTION ONCEONLY pattern CLOSEPAREN",
/* 101 */ "comment ::= OPENASSERTION COMMENT CLOSEPAREN",
/* 102 */ "recur ::= OPENASSERTION RECUR CLOSEPAREN",
* This function returns the symbolic name associated with a token
if ($tokenType > 0 && $tokenType < count(self::$yyTokenName)) {
return self::$yyTokenName[$tokenType];
* The following function deletes the value associated with a
* symbol. The symbol can be either a terminal or nonterminal.
* @param int the symbol code
* @param mixed the symbol's value
/* Here is inserted the actions which take place when a
** terminal or non-terminal is destroyed. This can happen
** when the symbol is popped from the stack during a
** reduce or during error processing or when a parser is
** being destroyed before it is finished parsing.
** Note: during a reduce, the only symbols destroyed are those
** which appear on the RHS of the rule, but which are not used
default: break; /* If no destructor action specified: do nothing */
* Pop the parser's stack once.
* If there is a destructor routine associated with the token which
* is popped from the stack, then call it.
* Return the major token number for the symbol popped.
* @param PHP_LexerGenerator_Regex_yyParser
if (self::$yyTraceFILE && $this->yyidx >= 0) {
fwrite(self::$yyTraceFILE,
self::$yyTracePrompt . 'Popping ' . self::$yyTokenName[$yytos->major] .
$yymajor = $yytos->major;
self::yy_destructor($yymajor, $yytos->minor);
* Deallocate and destroy a parser. Destructors are all called for
* all stack elements before shutting the parser down.
while ($this->yyidx >= 0) {
fclose(self::$yyTraceFILE);
* Based on the current state and parser stack, get a list of all
* possible lookahead tokens
$expected = self::$yyExpectedTokens[$state];
if (in_array($token, self::$yyExpectedTokens[$state], true)) {
if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
// too much recursion prevents proper detection
$yyruleno = $yyact - self::YYNSTATE;
$this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
self::$yyRuleInfo[$yyruleno]['lhs']);
if (isset (self::$yyExpectedTokens[$nextstate])) {
$expected += self::$yyExpectedTokens[$nextstate];
self::$yyExpectedTokens[$nextstate], true)) {
if ($nextstate < self::YYNSTATE) {
// we need to shift a non-terminal
$x->stateno = $nextstate;
$x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
// the last token was just ignored, we can't accept
// by ignoring input, this is in essence ignoring a
} elseif ($nextstate === self::YY_NO_ACTION) {
// input accepted, but not shifted (I guess)
* Based on the parser state and current parser stack, determine whether
* the lookahead token is possible.
* The parser will convert the token value to an error token if not. This
* catches some unusual edge cases where the parser would fail.
return true; // 0 is not part of this
if (in_array($token, self::$yyExpectedTokens[$state], true)) {
if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
// too much recursion prevents proper detection
$yyruleno = $yyact - self::YYNSTATE;
$this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
self::$yyRuleInfo[$yyruleno]['lhs']);
if (isset (self::$yyExpectedTokens[$nextstate]) &&
in_array($token, self::$yyExpectedTokens[$nextstate], true)) {
if ($nextstate < self::YYNSTATE) {
// we need to shift a non-terminal
$x->stateno = $nextstate;
$x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
} elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
// end of input: this is valid
// the last token was just ignored, we can't accept
// by ignoring input, this is in essence ignoring a
} elseif ($nextstate === self::YY_NO_ACTION) {
// input accepted, but not shifted (I guess)
* Find the appropriate action for a parser given the terminal
* look-ahead token iLookAhead.
* If the look-ahead token is YYNOCODE, then check to see if the action is
* independent of the look-ahead. If it is, return the action, otherwise
* @param int The look-ahead token
/* if ($this->yyidx < 0) return self::YY_NO_ACTION; */
if (!isset (self::$yy_shift_ofst[$stateno])) {
return self::$yy_default[$stateno];
$i = self::$yy_shift_ofst[$stateno];
if ($i === self::YY_SHIFT_USE_DFLT) {
return self::$yy_default[$stateno];
if ($iLookAhead == self::YYNOCODE) {
return self::YY_NO_ACTION;
if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
self::$yy_lookahead[$i] != $iLookAhead) {
if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
&& ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
if (self::$yyTraceFILE) {
fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " .
self::$yyTokenName[$iLookAhead] . " => " .
self::$yyTokenName[$iFallback] . "\n");
return self::$yy_default[$stateno];
return self::$yy_action[$i];
* Find the appropriate action for a parser given the non-terminal
* look-ahead token $iLookAhead.
* If the look-ahead token is self::YYNOCODE, then check to see if the action is
* independent of the look-ahead. If it is, return the action, otherwise
* return self::YY_NO_ACTION.
* @param int Current state number
* @param int The look-ahead token
/* $stateno = $this->yystack[$this->yyidx]->stateno; */
if (!isset (self::$yy_reduce_ofst[$stateno])) {
return self::$yy_default[$stateno];
$i = self::$yy_reduce_ofst[$stateno];
if ($i == self::YY_REDUCE_USE_DFLT) {
return self::$yy_default[$stateno];
if ($iLookAhead == self::YYNOCODE) {
return self::YY_NO_ACTION;
if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
self::$yy_lookahead[$i] != $iLookAhead) {
return self::$yy_default[$stateno];
return self::$yy_action[$i];
* Perform a shift action.
* @param int The new state to shift in
* @param int The major token to shift in
* @param mixed the minor token to shift in
function yy_shift($yyNewState, $yyMajor, $yypMinor)
if ($this->yyidx >= self::YYSTACKDEPTH) {
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt);
while ($this->yyidx >= 0) {
/* Here code is inserted which will execute if the parser
** stack ever overflows */
$yytos = new PHP_LexerGenerator_Regex_yyStackEntry;
$yytos->stateno = $yyNewState;
$yytos->major = $yyMajor;
$yytos->minor = $yypMinor;
if (self::$yyTraceFILE && $this->yyidx > 0) {
fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt,
fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt);
for($i = 1; $i <= $this->yyidx; $i++ ) {
fprintf(self::$yyTraceFILE, " %s",
self::$yyTokenName[$this->yystack[$i]->major]);
fwrite(self::$yyTraceFILE,"\n");
* The following table contains information about every rule that
* is used during the reduce.
* int $lhs; Symbol on the left-hand side of the rule
* int $nrhs; Number of right-hand side symbols in the rule
array( 'lhs' => 29, 'rhs' => 1 ),
array( 'lhs' => 30, 'rhs' => 3 ),
array( 'lhs' => 30, 'rhs' => 2 ),
array( 'lhs' => 30, 'rhs' => 2 ),
array( 'lhs' => 30, 'rhs' => 1 ),
array( 'lhs' => 30, 'rhs' => 3 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 1 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 31, 'rhs' => 2 ),
array( 'lhs' => 33, 'rhs' => 3 ),
array( 'lhs' => 33, 'rhs' => 4 ),
array( 'lhs' => 33, 'rhs' => 4 ),
array( 'lhs' => 33, 'rhs' => 5 ),
array( 'lhs' => 43, 'rhs' => 1 ),
array( 'lhs' => 43, 'rhs' => 1 ),
array( 'lhs' => 43, 'rhs' => 1 ),
array( 'lhs' => 43, 'rhs' => 3 ),
array( 'lhs' => 43, 'rhs' => 3 ),
array( 'lhs' => 43, 'rhs' => 3 ),
array( 'lhs' => 43, 'rhs' => 3 ),
array( 'lhs' => 43, 'rhs' => 3 ),
array( 'lhs' => 43, 'rhs' => 3 ),
array( 'lhs' => 43, 'rhs' => 3 ),
array( 'lhs' => 43, 'rhs' => 3 ),
array( 'lhs' => 43, 'rhs' => 1 ),
array( 'lhs' => 43, 'rhs' => 1 ),
array( 'lhs' => 43, 'rhs' => 2 ),
array( 'lhs' => 43, 'rhs' => 2 ),
array( 'lhs' => 43, 'rhs' => 2 ),
array( 'lhs' => 43, 'rhs' => 4 ),
array( 'lhs' => 43, 'rhs' => 4 ),
array( 'lhs' => 43, 'rhs' => 4 ),
array( 'lhs' => 43, 'rhs' => 4 ),
array( 'lhs' => 43, 'rhs' => 4 ),
array( 'lhs' => 43, 'rhs' => 4 ),
array( 'lhs' => 43, 'rhs' => 4 ),
array( 'lhs' => 43, 'rhs' => 4 ),
array( 'lhs' => 43, 'rhs' => 2 ),
array( 'lhs' => 43, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 1 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 1 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 1 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 1 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 1 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 1 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 3 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 3 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 3 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 3 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 3 ),
array( 'lhs' => 32, 'rhs' => 2 ),
array( 'lhs' => 32, 'rhs' => 3 ),
array( 'lhs' => 34, 'rhs' => 3 ),
array( 'lhs' => 34, 'rhs' => 5 ),
array( 'lhs' => 35, 'rhs' => 4 ),
array( 'lhs' => 35, 'rhs' => 5 ),
array( 'lhs' => 42, 'rhs' => 7 ),
array( 'lhs' => 42, 'rhs' => 6 ),
array( 'lhs' => 42, 'rhs' => 4 ),
array( 'lhs' => 42, 'rhs' => 5 ),
array( 'lhs' => 42, 'rhs' => 4 ),
array( 'lhs' => 42, 'rhs' => 5 ),
array( 'lhs' => 36, 'rhs' => 4 ),
array( 'lhs' => 36, 'rhs' => 4 ),
array( 'lhs' => 37, 'rhs' => 4 ),
array( 'lhs' => 37, 'rhs' => 4 ),
array( 'lhs' => 38, 'rhs' => 4 ),
array( 'lhs' => 38, 'rhs' => 5 ),
array( 'lhs' => 38, 'rhs' => 3 ),
array( 'lhs' => 38, 'rhs' => 4 ),
array( 'lhs' => 39, 'rhs' => 4 ),
array( 'lhs' => 40, 'rhs' => 3 ),
array( 'lhs' => 41, 'rhs' => 3 ),
* The following table contains a mapping of reduce action to method name
* that handles the reduction.
* If a rule is not set, it has no handler.
/* Beginning here are the reduction cases. A typical example
** #line <lineno> <grammarfile>
** function yy_r0($yymsp){ ... } // User supplied code
** #line <lineno> <thisfile>
$this->yystack[$this->yyidx + 0]->minor->string = str_replace('"', '\\"', $this->yystack[$this->yyidx + 0]->minor->string);
$x['subpatterns'] = $this->_subpatterns;
'pattern' => $this->yystack[$this->yyidx + - 2]->minor['pattern'] . '|' . $this->yystack[$this->yyidx + 0]->minor['pattern']));
'pattern' => $this->yystack[$this->yyidx + - 1]->minor['pattern'] . $this->yystack[$this->yyidx + 0]->minor['pattern']));
'pattern' => '[' . $this->yystack[$this->yyidx + - 1]->minor['pattern'] . ']'));
'pattern' => '[^' . $this->yystack[$this->yyidx + - 1]->minor['pattern'] . ']'));
'pattern' => '[' . $this->yystack[$this->yyidx + - 2]->minor['pattern'] . ']' . $this->yystack[$this->yyidx + 0]->minor));
'pattern' => '[^' . $this->yystack[$this->yyidx + - 2]->minor['pattern'] . ']' . $this->yystack[$this->yyidx + 0]->minor));
// adjust back-reference for containing ()
'pattern' => '\\' . ($this->_updatePattern ? ($this->yystack[$this->yyidx + 0]->minor + $this->_patternIndex) : $this->yystack[$this->yyidx + 0]->minor)));
' back-reference, use "\\0' . substr($this->yystack[$this->yyidx + 0]->minor, 1) . ' for octal');
'pattern' => '\\' . ($this->_updatePattern ? ($this->yystack[$this->yyidx + 0]->minor + $this->_patternIndex) : $this->yystack[$this->yyidx + 0]->minor)));
|