Compare commits

...
Author SHA1 Message Date
Felipe Pena 4445503ae0 - Reverted mem alloc function change
- Fixed lineno on method declarations
2010-07-20 17:22:51 +00:00
Felipe Pena 53293a6538 - Update exit status 2010-07-19 23:34:16 +00:00
Felipe Pena 38f2a2ed3f - Fixed wrong lineno by fixing the rules 2010-07-19 22:46:45 +00:00
Felipe Pena 1ec1dcb0d6 - Lets avoid unnecessary zend_verify_namespace() calls 2010-07-17 17:47:06 +00:00
Felipe Pena 97c93c980e - Opss, fix code 2010-07-17 01:24:20 +00:00
Felipe Pena d9201cba39 - Lets use the _emalloc, _efree functions 2010-07-15 17:57:22 +00:00
Felipe Pena 09ff94e900 - Added missing --no-generation-date flag 2010-07-15 16:43:53 +00:00
Felipe Pena 14477dbb4d - Minor compiler optimizations 2010-07-15 14:21:25 +00:00
Felipe Pena dfe0c17e68 - Inlining parser functions 2010-07-15 13:16:53 +00:00
Felipe Pena 5e04ca2e54 - Disable error recovery 2010-07-14 02:21:38 +00:00
Felipe Pena 5f5486b706 - Update exit_status, heh 2010-07-13 19:45:07 +00:00
Kalle Sommer Nielsen a19ab0755d Commit Felipe's change to the re2c flags to the Windows makefile aswell 2010-07-13 16:24:26 +00:00
Felipe Pena 445fd47c79 - Added --no-generation-date re2c flag to do not change the .h files always when changing the .l file 2010-07-13 15:50:05 +00:00
Felipe Pena 75f32bdad2 - Added missing tokens on ST_VAR_OFFSET state 2010-07-13 15:30:30 +00:00
Pierrick Charron e0c7dbf30d - Add YYNOERRORRECOVERY to disable error recovery processing
- Remove warning
2010-07-13 05:45:23 +00:00
Felipe Pena 6bed6c114e - Fixed SIGSEGV when E_PARSE occurred in zend_eval_stringl 2010-07-12 20:11:35 +00:00
Felipe Pena 087117419b - Woops, remove commented code 2010-07-12 19:14:26 +00:00
Felipe Pena c4cb864b92 - Fixed ext/tokenizer line number differences 2010-07-12 19:13:00 +00:00
Felipe Pena 7da34df439 - Fixed line number on error messages 2010-07-12 18:48:09 +00:00
Felipe Pena 233bdc7d2b - Removed Bison checks
- Removed TSRMLS_FETCH() call in zend_ini_parser %syntax_error
2010-07-12 13:52:43 +00:00
Felipe Pena 4d4ec8a963 - Removed bison flags related to zend_ini_parser 2010-07-12 13:38:13 +00:00
Pierrick Charron 96d49e4d5b Lemon version of the zend_ini_parser 2010-07-12 13:32:00 +00:00
Felipe Pena 6f32b2cda4 - Defined NDEBUG to avoid checks for tracefile, and added -l flag 2010-07-12 12:59:28 +00:00
Felipe Pena 3c8d3c08ac - Added ParseARG_STORE into yy_destructor template for suppress warning about unused %extra_argument 2010-07-12 12:42:11 +00:00
Felipe Pena e865de5881 - Added parser name and prototype declaration 2010-07-12 11:50:17 +00:00
Pierre Joye 811f8c32cb - windows support for lemon, 1st shot (some warning in lemon.c but seems to work) 2010-07-12 09:02:27 +00:00
Pierre Joye c516bfd602 - MFH pcre windows build fix 2010-07-12 08:51:41 +00:00
Felipe Pena 423c85fd8b - Fix rule name 2010-07-11 22:20:30 +00:00
Felipe Pena 031d4d4c2f - Woops, debug stuff :) 2010-07-11 22:00:50 +00:00
Felipe Pena 8ced178bd8 - Fixed namespace with braces rules
- Fixed scanner to just return the tokens, not yytext[0]
2010-07-11 21:53:17 +00:00
Felipe Pena 5e3aa49798 - Missing T_DOLLAR 2010-07-11 17:25:06 +00:00
Felipe Pena 819fee249f - Fixed ext/tokenizer to work with the new tokens (<, >, @, !, etc) 2010-07-11 14:17:26 +00:00
Felipe Pena c0db570336 - Added lemon to distclean 2010-07-11 13:21:00 +00:00
Felipe Pena d32b9dbf52 - Added lemon source to be build and use it to create the parser 2010-07-11 13:18:35 +00:00
Etienne Kneuss 64efbc9894 mostly WS, cleanup stuff 2010-07-11 00:44:07 +00:00
Felipe Pena 2610647b0e - Fix the static_scalar rule 2010-07-10 20:16:15 +00:00
Felipe Pena 1352520286 - Fixed variable variables as function name 2010-07-10 17:11:10 +00:00
Felipe Pena 67055d0af8 - Workaround for YYACCEPT on __halt_compiler() 2010-07-10 16:57:50 +00:00
Felipe Pena e1f175e576 - Fixed heredoc bug 2010-07-10 15:49:15 +00:00
Etienne Kneuss 79f3996bfc Fix lemon's return value and uncomment unaries/shifts 2010-07-10 11:10:38 +00:00
Etienne Kneuss 13d45760b3 Remove T_T_DOLLAR 2010-07-10 10:29:29 +00:00
Felipe Pena 8ccf85045e - Fixed stack overflow on ${a} 2010-07-10 00:50:56 +00:00
Felipe Pena 95210c41ac - Rename identifier A -> B 2010-07-10 00:26:21 +00:00
Felipe Pena 9878308fb7 s/T_DOLLAR/DOLLAR/ 2010-07-10 00:22:15 +00:00
Felipe Pena 1a2fe6faf0 - Removed -c Lemon flag to compress the action table (magically fixes the switch rule :D) 2010-07-09 19:41:41 +00:00
Felipe Pena 74499b10ad - Fixed @ precedence 2010-07-09 19:39:00 +00:00
Felipe Pena 4346721c5c - Fixed $var[0] interpolation and close tag 2010-07-09 16:26:46 +00:00
Felipe Pena c252503965 - Fixed scanner return rules 2010-07-09 15:34:05 +00:00
Felipe Pena 80a5fda9a2 - Fix switch and Parse call 2010-07-09 15:25:08 +00:00
Felipe Pena fdca15015b - WS 2010-07-09 14:43:23 +00:00
Felipe Pena 68c3f855a3 - Fixed array crashing 2010-07-09 14:16:37 +00:00
Felipe Pena 5ec7eb7469 - Added Lemon check and flag setting 2010-07-09 13:21:08 +00:00
Etienne Kneuss 02da3f3332 bailout on error 2010-07-09 13:07:12 +00:00
Etienne Kneuss e2f24383df Fix build without new productions 2010-07-09 12:30:15 +00:00
Etienne Kneuss 8c77721502 Fix exit code tests 2010-07-09 12:19:52 +00:00
Etienne Kneuss c7148edaeb Allow conflicts 2010-07-09 12:06:45 +00:00
Etienne Kneuss cfd3976960 Allow conflicts 2010-07-09 12:02:41 +00:00
Etienne Kneuss 87a3b40bc5 fix array 2010-07-09 11:43:27 +00:00
Etienne Kneuss 92e057a72d guard tsrm inside a ifdef, remains to specify it at the time of the lemon call 2010-07-09 11:39:27 +00:00
Etienne Kneuss 24d4af25e4 Fix irreducible rule 2010-07-09 11:25:59 +00:00
Etienne Kneuss 17fd7857bc Woops 2010-07-09 11:24:52 +00:00
Etienne Kneuss c38ff91f0d todo no longer needed, + A is always on the result side 2010-07-09 11:24:11 +00:00
Etienne Kneuss a2df0bd5fc Fix some stuff 2010-07-09 09:43:07 +00:00
Etienne Kneuss 7beb5eac3b Some fixes 2010-07-09 09:28:39 +00:00
Felipe Pena 4cd32421fc - More rules translated... 2010-07-09 00:43:34 +00:00
Felipe Pena c97007e87e - Added switch rule 2010-07-09 00:02:33 +00:00
Felipe Pena 4f55f8828a - Added try_catch, isset_variables rule 2010-07-08 23:22:41 +00:00
Felipe Pena 195d5b7b23 - Update tokenizer 2010-07-08 22:46:56 +00:00
Felipe Pena 2de963ed2c - Added foreach rules 2010-07-08 20:04:47 +00:00
Felipe Pena 45c6c3a75f - Update token list 2010-07-08 19:25:20 +00:00
Felipe Pena e81ad07c9e - More rules translated 2010-07-08 19:20:23 +00:00
Felipe Pena 2ec11dcc7c - Fixed array_pair_list and added T_EQUAL 2010-07-08 18:14:11 +00:00
Felipe Pena 8ba373ee6b - More rules translated 2010-07-08 18:06:51 +00:00
Felipe Pena 86771c29c8 - More rules translated! 2010-07-08 16:28:38 +00:00
Felipe Pena 143f44aa68 - More rules translated 2010-07-08 14:25:38 +00:00
Felipe Pena 6fce15d068 - Accidental change 2010-07-08 12:36:33 +00:00
Felipe Pena 2bcffc3727 - Making it "buildable" for testing 2010-07-08 12:30:48 +00:00
Etienne Kneuss 0ce7b657b0 simplify tokens, specify some stuff 2010-07-08 09:43:21 +00:00
Etienne Kneuss 07d697d86e move includes to the lemon definition file 2010-07-08 09:36:54 +00:00
Etienne Kneuss 5c8d488498 Initial stuff to start working on rules 2010-07-08 09:32:44 +00:00
Derick Rethans 69bb2dce74 - The Lemon branch. 2010-07-06 19:10:27 +00:00
29 changed files with 13137 additions and 6824 deletions

No files matched your search

+11 -6
View File
@@ -1,3 +1,8 @@
#
# Lemon
#
lemon: lemon.c
$(CC) -o $@ -Wall $?
#
# Zend
@@ -7,17 +12,17 @@ $(builddir)/zend_language_scanner.lo: $(srcdir)/zend_language_parser.h
$(builddir)/zend_ini_scanner.lo: $(srcdir)/zend_ini_parser.h
$(srcdir)/zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l)
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l)
$(srcdir)/zend_language_parser.h: $(srcdir)/zend_language_parser.c
$(srcdir)/zend_language_parser.c: $(srcdir)/zend_language_parser.y
@$(YACC) -p zend -v -d $(srcdir)/zend_language_parser.y -o $@
$(srcdir)/zend_language_parser.c: lemon $(srcdir)/zend_language_parser.y
$(LEMON) $(LEMON_FLAGS) $(srcdir)/zend_language_parser.y || test $$? -eq 2
$(srcdir)/zend_ini_parser.h: $(srcdir)/zend_ini_parser.c
$(srcdir)/zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
@$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o $@
$(srcdir)/zend_ini_parser.c: lemon $(srcdir)/zend_ini_parser.y
@$(LEMON) $(LEMON_FLAGS) $(srcdir)/zend_ini_parser.y
$(srcdir)/zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l)
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l)
$(builddir)/zend_indent.lo $(builddir)/zend_highlight.lo $(builddir)/zend_compile.lo: $(srcdir)/zend_language_parser.h
+2 -1
View File
@@ -1,3 +1,4 @@
LEMON = $(top_srcdir)/lemon
mkinstalldirs = $(top_srcdir)/build/shtool mkdir -p
INSTALL = $(top_srcdir)/build/shtool install -c
INSTALL_DATA = $(INSTALL) -m 644
@@ -111,7 +112,7 @@ clean:
rm -f libphp$(PHP_MAJOR_VERSION).la $(SAPI_CLI_PATH) $(OVERALL_TARGET) modules/* libs/*
distclean: clean
rm -f Makefile config.cache config.log config.status Makefile.objects Makefile.fragments libtool main/php_config.h stamp-h sapi/apache/libphp$(PHP_MAJOR_VERSION).module buildmk.stamp
rm -f Makefile lemon config.cache config.log config.status Makefile.objects Makefile.fragments libtool main/php_config.h stamp-h sapi/apache/libphp$(PHP_MAJOR_VERSION).module buildmk.stamp
$(EGREP) define'.*include/php' $(top_srcdir)/configure | $(SED) 's/.*>//'|xargs rm -f
.PHONY: all clean install distclean test
+5 -4
View File
@@ -31,19 +31,20 @@ zend_ini_scanner.lo: zend_ini_parser.h
# Language parser/scanner rules
zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
$(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt $(srcdir)/zend_language_scanner_defs.h -o$@ $(srcdir)/zend_language_scanner.l
$(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt $(srcdir)/zend_language_scanner_defs.h -o$@ $(srcdir)/zend_language_scanner.l
zend_language_parser.h: zend_language_parser.c
zend_language_parser.c: $(srcdir)/zend_language_parser.y
$(YACC) -p zend -v -d $(srcdir)/zend_language_parser.y -o zend_language_parser.c
$(LEMON) $(LEMON_FLAGS) $(srcdir)/zend_language_parser.y || test $$? -eq 2
# INI parser/scanner rules
zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o zend_ini_parser.c
$(LEMON) $(LEMON_FLAGS) $(srcdir)/zend_ini_parser.y
zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
$(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt $(srcdir)/zend_ini_scanner_defs.h -o$@ $(srcdir)/zend_ini_scanner.l
$(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt $(srcdir)/zend_ini_scanner_defs.h -o$@ $(srcdir)/zend_ini_scanner.l
zend_ini_parser.h: zend_ini_parser.c
-33
View File
@@ -2,39 +2,6 @@ dnl $Id$
dnl
dnl This file contains local autoconf functions.
AC_DEFUN([LIBZEND_BISON_CHECK],[
# we only support certain bison versions
bison_version_list="1.28 1.35 1.75 1.875 2.0 2.1 2.2 2.3 2.4 2.4.1 2.4.2"
# for standalone build of Zend Engine
test -z "$SED" && SED=sed
bison_version=none
if test "$YACC"; then
AC_CACHE_CHECK([for bison version], php_cv_bison_version, [
bison_version_vars=`bison --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | $SED -e 's/\./ /' | tr -d a-z`
php_cv_bison_version=invalid
if test -n "$bison_version_vars"; then
set $bison_version_vars
bison_version="${1}.${2}"
for bison_check_version in $bison_version_list; do
if test "$bison_version" = "$bison_check_version"; then
php_cv_bison_version="$bison_check_version (ok)"
break
fi
done
fi
])
fi
case $php_cv_bison_version in
""|invalid[)]
bison_msg="bison versions supported for regeneration of the Zend/PHP parsers: $bison_version_list (found: $bison_version)."
AC_MSG_WARN([$bison_msg])
YACC="exit 0;"
;;
esac
])
AC_DEFUN([ZEND_FP_EXCEPT],[
AC_CACHE_CHECK(whether fp_except is defined, ac_cv_type_fp_except,[
AC_TRY_COMPILE([
+80 -37
View File
@@ -611,8 +611,14 @@ static void zend_do_op_data(zend_op *data_op, const znode *value TSRMLS_DC) /* {
void zend_do_binary_assign_op(zend_uchar op, znode *result, const znode *op1, const znode *op2 TSRMLS_DC) /* {{{ */
{
int last_op_number = get_next_op_number(CG(active_op_array));
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
int last_op_number = 0;
zend_op *opline = NULL;
zend_check_writable_variable(op1);
zend_do_end_variable_parse(op1, BP_VAR_RW, 0 TSRMLS_CC);
last_op_number = get_next_op_number(CG(active_op_array));
opline = get_next_op(CG(active_op_array) TSRMLS_CC);
if (last_op_number > 0) {
zend_op *last_op = &CG(active_op_array)->opcodes[last_op_number-1];
@@ -655,12 +661,14 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar
zend_op opline;
zend_op *opline_ptr;
zend_llist *fetch_list_ptr;
zend_bool is_auto_global = 0;
if (varname->op_type == IS_CONST) {
if (Z_TYPE(varname->u.constant) != IS_STRING) {
convert_to_string(&varname->u.constant);
}
if (!zend_is_auto_global(varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC) &&
is_auto_global = zend_is_auto_global(varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC);
if (!is_auto_global &&
!(varname->u.constant.value.str.len == (sizeof("this")-1) &&
!memcmp(varname->u.constant.value.str.val, "this", sizeof("this"))) &&
(CG(active_op_array)->last == 0 ||
@@ -690,7 +698,7 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar
if (varname->op_type == IS_CONST) {
CALCULATE_LITERAL_HASH(opline_ptr->op1.constant);
if (zend_is_auto_global(varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC)) {
if (is_auto_global) {
opline_ptr->extended_value = ZEND_FETCH_GLOBAL;
}
}
@@ -792,7 +800,7 @@ void zend_do_fetch_static_member(znode *result, znode *class_name TSRMLS_DC) /*
void fetch_array_begin(znode *result, znode *varname, znode *first_dim TSRMLS_DC) /* {{{ */
{
fetch_simple_variable(result, varname, 1 TSRMLS_CC);
fetch_simple_variable_ex(result, varname, 1, ZEND_FETCH_W TSRMLS_CC);
fetch_array_dim(result, result, first_dim TSRMLS_CC);
}
@@ -5412,7 +5420,7 @@ void zend_do_fetch_static_variable(znode *varname, const znode *static_assignmen
if (varname->op_type == IS_CONST) {
zval_copy_ctor(&varname->u.constant);
}
fetch_simple_variable(&lval, varname, 0 TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
fetch_simple_variable_ex(&lval, varname, 0, ZEND_FETCH_W TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
if (fetch_type == ZEND_FETCH_LEXICAL) {
znode dummy;
@@ -5474,7 +5482,7 @@ void zend_do_fetch_global_variable(znode *varname, const znode *static_assignmen
if (varname->op_type == IS_CONST) {
zval_copy_ctor(&varname->u.constant);
}
fetch_simple_variable(&lval, varname, 0 TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
fetch_simple_variable_ex(&lval, varname, 0, ZEND_FETCH_W TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
zend_do_assign_ref(NULL, &lval, &result TSRMLS_CC);
CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result_type |= EXT_TYPE_UNUSED;
@@ -5523,7 +5531,7 @@ void zend_do_indirect_references(znode *result, const znode *num_references, zno
*variable = *result;
}
zend_do_begin_variable_parse(TSRMLS_C);
fetch_simple_variable(result, variable, 1 TSRMLS_CC);
fetch_simple_variable_ex(result, variable, 1, ZEND_FETCH_W TSRMLS_CC);
}
/* }}} */
@@ -6101,45 +6109,80 @@ int zend_register_auto_global(const char *name, uint name_len, zend_auto_global_
}
/* }}} */
int zendlex(znode *zendlval TSRMLS_DC) /* {{{ */
int zendparse(TSRMLS_D) /* {{{ */
{
int retval;
int token, halting = 0, old_exit_status;
void *pParser;
if (CG(increment_lineno)) {
CG(zend_lineno)++;
CG(increment_lineno) = 0;
if ((pParser = zend_lang_parseAlloc(malloc)) == NULL) {
zend_lang_parseFree(pParser, free);
return 1;
}
old_exit_status = EG(exit_status);
EG(exit_status) = 0;
while (1) {
znode zendlval;
zendlval.op_type = IS_CONST;
INIT_PZVAL(&zendlval.u.constant);
if (CG(increment_lineno)) {
CG(zend_lineno)++;
CG(increment_lineno) = 0;
}
again:
Z_TYPE(zendlval->u.constant) = IS_LONG;
retval = lex_scan(&zendlval->u.constant TSRMLS_CC);
switch (retval) {
case T_COMMENT:
case T_DOC_COMMENT:
case T_OPEN_TAG:
case T_WHITESPACE:
goto again;
Z_TYPE(zendlval.u.constant) = IS_LONG;
case T_CLOSE_TAG:
if (LANG_SCNG(yy_text)[LANG_SCNG(yy_leng)-1] != '>') {
CG(increment_lineno) = 1;
}
if (CG(has_bracketed_namespaces) && !CG(in_namespace)) {
goto again;
}
retval = ';'; /* implicit ; */
/* Call the scanner */
token = lex_scan(&zendlval.u.constant, &CG(zend_lineno) TSRMLS_CC);
switch (token) {
case T_COMMENT:
case T_DOC_COMMENT:
case T_OPEN_TAG:
case T_WHITESPACE:
goto again;
case T_HALT_COMPILER:
halting = 1;
break;
case T_END_HEREDOC:
efree(Z_STRVAL(zendlval.u.constant));
break;
case T_OPEN_TAG_WITH_ECHO:
token = T_ECHO;
break;
case T_CLOSE_TAG:
if (LANG_SCNG(yy_text)[LANG_SCNG(yy_leng)-1] != '>') {
CG(increment_lineno) = 1;
}
if (CG(has_bracketed_namespaces) && !CG(in_namespace)) {
goto again;
}
token = T_SEMICOLON;
default:
break;
}
zend_lang_parse(pParser, token, zendlval TSRMLS_CC);
if (token == 0 || EG(exit_status) == 255) {
break;
case T_OPEN_TAG_WITH_ECHO:
retval = T_ECHO;
break;
case T_END_HEREDOC:
efree(Z_STRVAL(zendlval->u.constant));
} else if (halting == 1 && token == T_SEMICOLON){
/* Handles __HALT_COMPILER(); */
zend_lang_parse(pParser, 0, zendlval TSRMLS_CC);
break;
}
}
zend_lang_parseFree(pParser, free);
INIT_PZVAL(&zendlval->u.constant);
zendlval->op_type = IS_CONST;
return retval;
if (EG(exit_status) == 255) {
/* We got an E_PARSE */
return 1;
}
EG(exit_status) = old_exit_status;
return 0;
}
/* }}} */
+8 -2
View File
@@ -83,6 +83,8 @@ typedef struct _znode { /* used only during compilation */
zend_uint EA; /* extended attributes */
} znode;
typedef znode znode_array[5];
typedef struct _zend_execute_data zend_execute_data;
#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data TSRMLS_DC
@@ -378,7 +380,7 @@ void zend_init_compiler_data_structures(TSRMLS_D);
extern ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);
extern ZEND_API zend_op_array *(*zend_compile_string)(zval *source_string, char *filename TSRMLS_DC);
ZEND_API int lex_scan(zval *zendlval TSRMLS_DC);
ZEND_API int lex_scan(zval *zendlval, int *lineno TSRMLS_DC);
void startup_scanner(TSRMLS_D);
void shutdown_scanner(TSRMLS_D);
@@ -660,7 +662,11 @@ ZEND_API zend_bool zend_is_auto_global(const char *name, uint name_len TSRMLS_DC
ZEND_API int zend_auto_global_disable_jit(const char *varname, zend_uint varname_length TSRMLS_DC);
ZEND_API size_t zend_dirname(char *path, size_t len);
int zendlex(znode *zendlval TSRMLS_DC);
/* Parser */
int zendparse(TSRMLS_D);
void *zend_lang_parseAlloc(void *(*mallocProc)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC));
void zend_lang_parseFree(void *p, void (*freeProc)(void* ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC));
void zend_lang_parse(void *yyp, int yymajor, znode yyminor TSRMLS_DC);
int zend_add_literal(zend_op_array *op_array, const zval *zv);
-2
View File
@@ -32,11 +32,9 @@ BEGIN_EXTERN_C()
/* Compiler */
#ifdef ZTS
# define CG(v) TSRMG(compiler_globals_id, zend_compiler_globals *, v)
int zendparse(void *compiler_globals);
#else
# define CG(v) (compiler_globals.v)
extern ZEND_API struct _zend_compiler_globals compiler_globals;
int zendparse(void);
#endif
+5 -5
View File
@@ -90,7 +90,7 @@ ZEND_API void zend_html_puts(const char *s, uint len TSRMLS_DC)
ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini TSRMLS_DC)
{
zval token;
int token_type;
int token_type, lineno = 0;
char *last_color = syntax_highlighter_ini->highlight_html;
char *next_color;
@@ -98,7 +98,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
zend_printf("<span style=\"color: %s\">\n", last_color);
/* highlight stuff coming back from zendlex() */
token.type = 0;
while ((token_type=lex_scan(&token TSRMLS_CC))) {
while ((token_type=lex_scan(&token, &lineno TSRMLS_CC))) {
switch (token_type) {
case T_INLINE_HTML:
next_color = syntax_highlighter_ini->highlight_html;
@@ -174,11 +174,11 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
ZEND_API void zend_strip(TSRMLS_D)
{
zval token;
int token_type;
int token_type, lineno = 0;
int prev_space = 0;
token.type = 0;
while ((token_type=lex_scan(&token TSRMLS_CC))) {
while ((token_type=lex_scan(&token, &lineno TSRMLS_CC))) {
switch (token_type) {
case T_WHITESPACE:
if (!prev_space) {
@@ -195,7 +195,7 @@ ZEND_API void zend_strip(TSRMLS_D)
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
efree(token.value.str.val);
/* read the following character, either newline or ; */
if (lex_scan(&token TSRMLS_CC) != T_WHITESPACE) {
if (lex_scan(&token, &lineno TSRMLS_CC) != T_WHITESPACE) {
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
}
zend_write("\n", sizeof("\n") - 1);
+2 -2
View File
@@ -52,7 +52,7 @@ ZEND_API void zend_indent()
zval token;
int token_type;
int in_string=0;
int nest_level=0;
int nest_level=0, lineno = 0;
int emit_whitespace[256];
int i;
TSRMLS_FETCH();
@@ -61,7 +61,7 @@ ZEND_API void zend_indent()
/* highlight stuff coming back from zendlex() */
token.type = 0;
while ((token_type=lex_scan(&token TSRMLS_CC))) {
while ((token_type=lex_scan(&token, &lineno TSRMLS_CC))) {
switch (token_type) {
case T_INLINE_HTML:
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
+1
View File
@@ -208,6 +208,7 @@ END_EXTERN_C()
typedef struct _zend_ini_parser_param {
zend_ini_parser_cb_t ini_parser_cb;
void *arg;
zend_bool syntax_error;
} zend_ini_parser_param;
#endif /* ZEND_INI_H */
+154 -156
View File
@@ -1,4 +1,4 @@
%{
%include{
/*
+----------------------------------------------------------------------+
| Zend Engine |
@@ -13,7 +13,9 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Zeev Suraski <zeev@zend.com> |
| Author: Pierrick Charron <pierrick@php.net> |
| Yacc version authors: |
| Zeev Suraski <zeev@zend.com> |
| Jani Taskinen <jani@php.net> |
+----------------------------------------------------------------------+
*/
@@ -29,19 +31,17 @@
#include "zend_ini_scanner.h"
#include "zend_extensions.h"
#define YYERROR_VERBOSE
#define YYSTYPE zval
#ifdef ZTS
#define YYPARSE_PARAM tsrm_ls
#define YYLEX_PARAM tsrm_ls
int ini_parse(void *arg);
#else
int ini_parse(void);
#endif
#define NDEBUG
#define YYNOERRORRECOVERY
#define ZEND_INI_PARSER_CB (CG(ini_parser_param))->ini_parser_cb
#define ZEND_INI_PARSER_ARG (CG(ini_parser_param))->arg
#define ZEND_INI_PARSER_SE (CG(ini_parser_param))->syntax_error
int ini_parse(TSRMLS_D);
void *zend_ini_parseAlloc(void *(*mallocProc)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC));
void zend_ini_parseFree(void *p, void (*freeProc)(void* ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC));
void zend_ini_parse(void *yyp, int yymajor, zval yyminor TSRMLS_DC);
/* {{{ zend_ini_do_op()
*/
@@ -90,7 +90,7 @@ static void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
*/
static void zend_ini_init_string(zval *result)
{
Z_STRVAL_P(result) = malloc(1);
Z_STRVAL_P(result) = (char *) malloc(1);
Z_STRVAL_P(result)[0] = 0;
Z_STRLEN_P(result) = 0;
Z_TYPE_P(result) = IS_STRING;
@@ -144,49 +144,19 @@ static void zend_ini_get_var(zval *result, zval *name TSRMLS_DC)
if (zend_get_configuration_directive(Z_STRVAL_P(name), Z_STRLEN_P(name)+1, &curval) == SUCCESS) {
Z_STRVAL_P(result) = zend_strndup(Z_STRVAL(curval), Z_STRLEN(curval));
Z_STRLEN_P(result) = Z_STRLEN(curval);
Z_TYPE_P(result) = IS_STRING;
/* ..or if not found, try ENV */
} else if ((envvar = zend_getenv(Z_STRVAL_P(name), Z_STRLEN_P(name) TSRMLS_CC)) != NULL ||
(envvar = getenv(Z_STRVAL_P(name))) != NULL) {
Z_STRVAL_P(result) = strdup(envvar);
Z_STRLEN_P(result) = strlen(envvar);
Z_TYPE_P(result) = IS_STRING;
} else {
zend_ini_init_string(result);
}
}
/* }}} */
/* {{{ ini_error()
*/
static void ini_error(char *msg)
{
char *error_buf;
int error_buf_len;
char *currently_parsed_filename;
TSRMLS_FETCH();
currently_parsed_filename = zend_ini_scanner_get_filename(TSRMLS_C);
if (currently_parsed_filename) {
error_buf_len = 128 + strlen(msg) + strlen(currently_parsed_filename); /* should be more than enough */
error_buf = (char *) emalloc(error_buf_len);
sprintf(error_buf, "%s in %s on line %d\n", msg, currently_parsed_filename, zend_ini_scanner_get_lineno(TSRMLS_C));
} else {
error_buf = estrdup("Invalid configuration directive\n");
}
if (CG(ini_parser_unbuffered_errors)) {
#ifdef PHP_WIN32
MessageBox(NULL, error_buf, "PHP Error", MB_OK|MB_TOPMOST|0x00200000L);
#else
fprintf(stderr, "PHP: %s", error_buf);
#endif
} else {
zend_error(E_WARNING, "%s", error_buf);
}
efree(error_buf);
}
/* }}} */
/* {{{ zend_parse_ini_file()
*/
ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg TSRMLS_DC)
@@ -196,6 +166,7 @@ ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_erro
ini_parser_param.ini_parser_cb = ini_parser_cb;
ini_parser_param.arg = arg;
ini_parser_param.syntax_error = 0;
CG(ini_parser_param) = &ini_parser_param;
if (zend_ini_open_file_for_scanning(fh, scanner_mode TSRMLS_CC) == FAILURE) {
@@ -225,6 +196,7 @@ ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int s
ini_parser_param.ini_parser_cb = ini_parser_cb;
ini_parser_param.arg = arg;
ini_parser_param.syntax_error = 0;
CG(ini_parser_param) = &ini_parser_param;
if (zend_ini_prepare_string_for_scanning(str, scanner_mode TSRMLS_CC) == FAILURE) {
@@ -244,134 +216,160 @@ ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int s
}
/* }}} */
%}
int ini_parse(TSRMLS_D) /* {{{ */
{
int token;
void *pParser = zend_ini_parseAlloc(malloc);
%expect 0
%pure_parser
if (pParser == NULL) {
zend_ini_parseFree(pParser, free);
return 1;
}
%token TC_SECTION
%token TC_RAW
%token TC_CONSTANT
%token TC_NUMBER
%token TC_STRING
%token TC_WHITESPACE
%token TC_LABEL
%token TC_OFFSET
%token TC_DOLLAR_CURLY
%token TC_VARNAME
%token TC_QUOTED_STRING
%token BOOL_TRUE
%token BOOL_FALSE
%token END_OF_LINE
%token '=' ':' ',' '.' '"' '\'' '^' '+' '-' '/' '*' '%' '$' '~' '<' '>' '?' '@' '{' '}'
%left '|' '&'
%right '~' '!'
while (1) {
zval zendval;
token = ini_lex(&zendval TSRMLS_CC);
zend_ini_parse(pParser, token, zendval TSRMLS_CC);
%%
statement_list:
statement_list statement
| /* empty */
;
statement:
TC_SECTION section_string_or_value ']' {
#if DEBUG_CFG_PARSER
printf("SECTION: [%s]\n", Z_STRVAL($2));
#endif
ZEND_INI_PARSER_CB(&$2, NULL, NULL, ZEND_INI_PARSER_SECTION, ZEND_INI_PARSER_ARG TSRMLS_CC);
free(Z_STRVAL($2));
if (token == 0 || ZEND_INI_PARSER_SE) {
break;
}
| TC_LABEL '=' string_or_value {
#if DEBUG_CFG_PARSER
printf("NORMAL: '%s' = '%s'\n", Z_STRVAL($1), Z_STRVAL($3));
}
zend_ini_parseFree(pParser, free);
if (ZEND_INI_PARSER_SE) {
return 1;
} else {
return 0;
}
}
/* }}} */
}
%syntax_error {
char *error_buf;
int error_buf_len;
char *currently_parsed_filename;
ZEND_INI_PARSER_SE = 1;
currently_parsed_filename = zend_ini_scanner_get_filename(TSRMLS_C);
if (currently_parsed_filename) {
error_buf_len = 128 + INI_SCNG(yy_leng) + strlen(currently_parsed_filename); /* should be more than enough */
error_buf = (char *) emalloc(error_buf_len);
sprintf(error_buf, "syntax error, unexpected '%.*s' in %s on line %d\n", INI_SCNG(yy_leng), INI_SCNG(yy_text), currently_parsed_filename, zend_ini_scanner_get_lineno(TSRMLS_C));
} else {
error_buf = estrdup("Invalid configuration directive\n");
}
if (CG(ini_parser_unbuffered_errors)) {
#ifdef PHP_WIN32
MessageBox(NULL, error_buf, "PHP Error", MB_OK|MB_TOPMOST|0x00200000L);
#else
fprintf(stderr, "PHP: %s", error_buf);
#endif
ZEND_INI_PARSER_CB(&$1, &$3, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC);
free(Z_STRVAL($1));
free(Z_STRVAL($3));
}
| TC_OFFSET option_offset ']' '=' string_or_value {
} else {
zend_error(E_WARNING, "%s", error_buf);
}
efree(error_buf);
}
%token_type {zval}
%name zend_ini_parse
%ifdef ZTS
%extra_argument {void ***tsrm_ls}
%endif
%token_prefix TC_
/* Precedences */
%left BW_OR BW_AND.
%right BW_NOT BOOL_NOT.
start ::= statement_list.
statement_list ::= statement_list statement.
statement_list ::= .
statement ::= SECTION section_string_or_value(C) RBRACKET. {
#if DEBUG_CFG_PARSER
printf("OFFSET: '%s'[%s] = '%s'\n", Z_STRVAL($1), Z_STRVAL($2), Z_STRVAL($5));
printf("SECTION: [%s]\n", Z_STRVAL(C));
#endif
ZEND_INI_PARSER_CB(&$1, &$5, &$2, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC);
free(Z_STRVAL($1));
free(Z_STRVAL($2));
free(Z_STRVAL($5));
}
| TC_LABEL { ZEND_INI_PARSER_CB(&$1, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC); free(Z_STRVAL($1)); }
| END_OF_LINE
;
ZEND_INI_PARSER_CB(&C, NULL, NULL, ZEND_INI_PARSER_SECTION, ZEND_INI_PARSER_ARG TSRMLS_CC);
free(Z_STRVAL(C));
}
statement ::= LABEL(B) EQUAL string_or_value(D). {
#if DEBUG_CFG_PARSER
printf("NORMAL: '%s' = '%s'\n", Z_STRVAL(B), Z_STRVAL(D));
#endif
ZEND_INI_PARSER_CB(&B, &D, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC);
free(Z_STRVAL(B));
free(Z_STRVAL(D));
}
statement ::= OFFSET(B) option_offset(C) RBRACKET EQUAL string_or_value(F). {
#if DEBUG_CFG_PARSER
printf("OFFSET: '%s'[%s] = '%s'\n", Z_STRVAL(B), Z_STRVAL(C), Z_STRVAL(F));
#endif
ZEND_INI_PARSER_CB(&B, &F, &C, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC);
free(Z_STRVAL(B));
free(Z_STRVAL(C));
free(Z_STRVAL(F));
}
statement ::= LABEL(B). { ZEND_INI_PARSER_CB(&B, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC); free(Z_STRVAL(B)); }
statement ::= END_OF_LINE.
section_string_or_value:
var_string_list_section { $$ = $1; }
| /* empty */ { zend_ini_init_string(&$$); }
;
section_string_or_value(A) ::= var_string_list_section(B). { A = B; }
section_string_or_value(A) ::= . { zend_ini_init_string(&A); }
string_or_value:
expr { $$ = $1; }
| BOOL_TRUE { $$ = $1; }
| BOOL_FALSE { $$ = $1; }
| END_OF_LINE { zend_ini_init_string(&$$); }
;
string_or_value(A) ::= expr(B). { A = B; }
string_or_value(A) ::= BOOL_TRUE(B). { A = B; }
string_or_value(A) ::= BOOL_FALSE(B). { A = B; }
string_or_value(A) ::= END_OF_LINE. { zend_ini_init_string(&A); }
option_offset:
var_string_list { $$ = $1; }
| /* empty */ { zend_ini_init_string(&$$); }
;
option_offset(A) ::= var_string_list(B). { A = B; }
option_offset(A) ::= . { zend_ini_init_string(&A); }
encapsed_list:
encapsed_list cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); }
| encapsed_list TC_QUOTED_STRING { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); }
| /* empty */ { zend_ini_init_string(&$$); }
;
encapsed_list(A) ::= encapsed_list(B) cfg_var_ref(C). { zend_ini_add_string(&A, &B, &C); free(Z_STRVAL(C)); }
encapsed_list(A) ::= encapsed_list(B) QUOTED_STRING(C). { zend_ini_add_string(&A, &B, &C); free(Z_STRVAL(C)); }
encapsed_list(A) ::= . { zend_ini_init_string(&A); }
var_string_list_section:
cfg_var_ref { $$ = $1; }
| constant_literal { $$ = $1; }
| '"' encapsed_list '"' { $$ = $2; }
| var_string_list_section cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); }
| var_string_list_section constant_literal { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); }
| var_string_list_section '"' encapsed_list '"' { zend_ini_add_string(&$$, &$1, &$3); free(Z_STRVAL($3)); }
;
var_string_list_section(A) ::= cfg_var_ref(B). { A = B; }
var_string_list_section(A) ::= constant_literal(B). { A = B; }
var_string_list_section(A) ::= QUOTE encapsed_list(C) QUOTE. { A = C; }
var_string_list_section(A) ::= var_string_list_section(B) cfg_var_ref(C). { zend_ini_add_string(&A, &B, &C); free(Z_STRVAL(C)); }
var_string_list_section(A) ::= var_string_list_section(B) constant_literal(C). { zend_ini_add_string(&A, &B, &C); free(Z_STRVAL(C)); }
var_string_list_section(A) ::= var_string_list_section(B) QUOTE encapsed_list(D) QUOTE. { zend_ini_add_string(&A, &B, &D); free(Z_STRVAL(D)); }
var_string_list:
cfg_var_ref { $$ = $1; }
| constant_string { $$ = $1; }
| '"' encapsed_list '"' { $$ = $2; }
| var_string_list cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); }
| var_string_list constant_string { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); }
| var_string_list '"' encapsed_list '"' { zend_ini_add_string(&$$, &$1, &$3); free(Z_STRVAL($3)); }
;
var_string_list(A) ::= cfg_var_ref(B). { A = B; }
var_string_list(A) ::= constant_string(B). { A = B; }
var_string_list(A) ::= QUOTE encapsed_list(C) QUOTE. { A = C; }
var_string_list(A) ::= var_string_list(B) cfg_var_ref(C). { zend_ini_add_string(&A, &B, &C); free(Z_STRVAL(C)); }
var_string_list(A) ::= var_string_list(B) constant_string(C). { zend_ini_add_string(&A, &B, &C); free(Z_STRVAL(C)); }
var_string_list(A) ::= var_string_list(B) QUOTE encapsed_list(D) QUOTE. { zend_ini_add_string(&A, &B, &D); free(Z_STRVAL(D)); }
expr:
var_string_list { $$ = $1; }
| expr '|' expr { zend_ini_do_op('|', &$$, &$1, &$3); }
| expr '&' expr { zend_ini_do_op('&', &$$, &$1, &$3); }
| '~' expr { zend_ini_do_op('~', &$$, &$2, NULL); }
| '!' expr { zend_ini_do_op('!', &$$, &$2, NULL); }
| '(' expr ')' { $$ = $2; }
;
expr(A) ::= var_string_list(B). { A = B; }
expr(A) ::= expr(B) BW_OR expr(D). { zend_ini_do_op('|', &A, &B, &D); }
expr(A) ::= expr(B) BW_AND expr(D). { zend_ini_do_op('&', &A, &B, &D); }
expr(A) ::= BW_NOT expr(C). { zend_ini_do_op('~', &A, &C, NULL); }
expr(A) ::= BOOL_NOT expr(C). { zend_ini_do_op('!', &A, &C, NULL); }
expr(A) ::= LPAREN expr(C) RPAREN. { A = C; }
cfg_var_ref:
TC_DOLLAR_CURLY TC_VARNAME '}' { zend_ini_get_var(&$$, &$2 TSRMLS_CC); free(Z_STRVAL($2)); }
;
cfg_var_ref(A) ::= DOLLAR_CURLY VARNAME(C) RBRACE. { zend_ini_get_var(&A, &C TSRMLS_CC); free(Z_STRVAL(C)); }
constant_literal:
TC_CONSTANT { $$ = $1; }
| TC_RAW { $$ = $1; /*printf("TC_RAW: '%s'\n", Z_STRVAL($1));*/ }
| TC_NUMBER { $$ = $1; /*printf("TC_NUMBER: '%s'\n", Z_STRVAL($1));*/ }
| TC_STRING { $$ = $1; /*printf("TC_STRING: '%s'\n", Z_STRVAL($1));*/ }
| TC_WHITESPACE { $$ = $1; /*printf("TC_WHITESPACE: '%s'\n", Z_STRVAL($1));*/ }
;
constant_literal(A) ::= CONSTANT(B). { A = B; }
constant_literal(A) ::= RAW(B). { A = B; }
constant_literal(A) ::= NUMBER(B). { A = B; }
constant_literal(A) ::= STRING(B). { A = B; }
constant_literal(A) ::= WHITESPACE(B). { A = B; }
constant_string:
TC_CONSTANT { zend_ini_get_constant(&$$, &$1 TSRMLS_CC); }
| TC_RAW { $$ = $1; /*printf("TC_RAW: '%s'\n", Z_STRVAL($1));*/ }
| TC_NUMBER { $$ = $1; /*printf("TC_NUMBER: '%s'\n", Z_STRVAL($1));*/ }
| TC_STRING { $$ = $1; /*printf("TC_STRING: '%s'\n", Z_STRVAL($1));*/ }
| TC_WHITESPACE { $$ = $1; /*printf("TC_WHITESPACE: '%s'\n", Z_STRVAL($1));*/ }
;
constant_string(A) ::= CONSTANT(B). { zend_ini_get_constant(&A, &B TSRMLS_CC); }
constant_string(A) ::= RAW(B). { A = B; }
constant_string(A) ::= NUMBER(B). { A = B; }
constant_string(A) ::= STRING(B). { A = B; }
constant_string(A) ::= WHITESPACE(B). { A = B; }
/*
* Local variables:
+1318 -1210
View File
File diff suppressed because it is too large. Load diff
+37 -17
View File
@@ -315,7 +315,7 @@ restart:
if (YYCURSOR >= YYLIMIT) {
if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) {
BEGIN(INITIAL);
return END_OF_LINE;
return TC_END_OF_LINE;
}
return 0;
}
@@ -374,7 +374,7 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
<ST_SECTION_RAW,ST_SECTION_VALUE>"]"{TABS_AND_SPACES}*{NEWLINE}? { /* End of section */
BEGIN(INITIAL);
SCNG(lineno)++;
return ']';
return TC_RBRACKET;
}
<INITIAL>{LABEL}"["{TABS_AND_SPACES}* { /* Start of option with offset */
@@ -392,7 +392,7 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
<ST_OFFSET>{TABS_AND_SPACES}*"]" { /* End of section or an option offset */
BEGIN(INITIAL);
return ']';
return TC_RBRACKET;
}
<ST_DOUBLE_QUOTES,ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{DOLLAR_CURLY} { /* Variable start */
@@ -412,15 +412,15 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
<ST_VARNAME>"}" { /* Variable end */
yy_pop_state(TSRMLS_C);
return '}';
return TC_RBRACE;
}
<INITIAL,ST_VALUE>("true"|"on"|"yes"){TABS_AND_SPACES}* { /* TRUE value (when used outside option value/offset this causes parse error!) */
RETURN_TOKEN(BOOL_TRUE, "1", 1);
RETURN_TOKEN(TC_BOOL_TRUE, "1", 1);
}
<INITIAL,ST_VALUE>("false"|"off"|"no"|"none"|"null"){TABS_AND_SPACES}* { /* FALSE value (when used outside option value/offset this causes parse error!)*/
RETURN_TOKEN(BOOL_FALSE, "", 0);
RETURN_TOKEN(TC_BOOL_FALSE, "", 0);
}
<INITIAL>{LABEL} { /* Get option name */
@@ -439,7 +439,7 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
} else {
yy_push_state(ST_VALUE TSRMLS_CC);
}
return '=';
return TC_EQUAL;
}
<ST_RAW>{RAW_VALUE_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
@@ -458,7 +458,7 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
<ST_VALUE,ST_RAW>{TABS_AND_SPACES}*{NEWLINE} { /* End of option value */
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
return TC_END_OF_LINE;
}
<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{CONSTANT} { /* Get constant option value */
@@ -473,14 +473,34 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
return yytext[0];
}
<ST_VALUE>{OPERATORS}{TABS_AND_SPACES}* { /* Boolean operators */
return yytext[0];
<ST_VALUE>"|"{TABS_AND_SPACES}* {
return TC_BW_OR;
}
<ST_VALUE>"&"{TABS_AND_SPACES}* {
return TC_BW_AND;
}
<ST_VALUE>"~"{TABS_AND_SPACES}* {
return TC_BW_NOT;
}
<ST_VALUE>"!"{TABS_AND_SPACES}* {
return TC_BOOL_NOT;
}
<ST_VALUE>"("{TABS_AND_SPACES}* {
return TC_LPAREN;
}
<ST_VALUE>")"{TABS_AND_SPACES}* {
return TC_RPAREN;
}
<ST_VALUE>[=] { /* Make = used in option value to trigger error */
yyless(0);
BEGIN(INITIAL);
return END_OF_LINE;
return TC_END_OF_LINE;
}
<ST_VALUE>{VALUE_CHARS}+ { /* Get everything else as option/offset value */
@@ -493,12 +513,12 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{TABS_AND_SPACES}*["] { /* Double quoted '"' string start */
yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC);
return '"';
return TC_QUOTE;
}
<ST_DOUBLE_QUOTES>["]{TABS_AND_SPACES}* { /* Double quoted '"' string ends */
yy_pop_state(TSRMLS_C);
return '"';
return TC_QUOTE;
}
<ST_DOUBLE_QUOTES>[^] { /* Escape double quoted string contents */
@@ -548,25 +568,25 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
<INITIAL>{TABS_AND_SPACES}*{NEWLINE} {
SCNG(lineno)++;
return END_OF_LINE;
return TC_END_OF_LINE;
}
<INITIAL,ST_VALUE,ST_RAW>{TABS_AND_SPACES}*[;][^\r\n]*{NEWLINE} { /* Comment */
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
return TC_END_OF_LINE;
}
<INITIAL>{TABS_AND_SPACES}*[#][^\r\n]*{NEWLINE} { /* #Comment */
zend_error(E_DEPRECATED, "Comments starting with '#' are deprecated in %s on line %d", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno));
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
return TC_END_OF_LINE;
}
<ST_VALUE,ST_RAW>[^] { /* End of option value (if EOF is reached before EOL */
BEGIN(INITIAL);
return END_OF_LINE;
return TC_END_OF_LINE;
}
<*>[^] {
+1 -1
View File
@@ -1,4 +1,4 @@
/* Generated by re2c 0.13.5 on Tue May 25 22:53:58 2010 */
/* Generated by re2c 0.13.5 on Sun Jul 11 15:00:59 2010 */
#line 3 "Zend/zend_ini_scanner_defs.h"
enum YYCONDTYPE {
+1050 -1026
View File
File diff suppressed because it is too large. Load diff
+4268 -4070
View File
File diff suppressed because it is too large. Load diff
+134 -30
View File
@@ -96,7 +96,7 @@ do { \
\
while (p<boundary) { \
if (*p == '\n' || (*p == '\r' && (*(p+1) != '\n'))) { \
CG(zend_lineno)++; \
++(*lineno); \
} \
p++; \
} \
@@ -105,7 +105,7 @@ do { \
#define HANDLE_NEWLINE(c) \
{ \
if (c == '\n' || c == '\r') { \
CG(zend_lineno)++; \
++(*lineno); \
} \
}
@@ -728,7 +728,7 @@ ZEND_API int zend_multibyte_read_script(unsigned char *buf, size_t n TSRMLS_DC)
zendlval->value.str.len = yyleng;
#endif /* ZEND_MULTIBYTE */
static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quote_type TSRMLS_DC)
static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quote_type, int *lineno TSRMLS_DC)
{
register char *s, *t;
char *end;
@@ -825,7 +825,7 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo
}
if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
CG(zend_lineno)++;
++(*lineno);
}
s++;
}
@@ -842,7 +842,7 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo
}
int lex_scan(zval *zendlval TSRMLS_DC)
int lex_scan(zval *zendlval, int *lineno TSRMLS_DC)
{
restart:
SCNG(yy_text) = YYCURSOR;
@@ -858,13 +858,15 @@ HNUM "0x"[0-9a-fA-F]+
LABEL [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
WHITESPACE [ \n\r\t]+
TABS_AND_SPACES [ \t]*
TOKENS [;:,.\[\]()|^&+-/*=%!~$<>?@]
ANY_CHAR [^]
NEWLINE ("\r"|"\n"|"\r\n")
/* compute yyleng before each rule */
<!*> := yyleng = YYCURSOR - SCNG(yy_text);
<ST_IN_SCRIPTING>"?" {
return T_QUESTION_MARK;
}
<ST_IN_SCRIPTING>"exit" {
return T_EXIT;
@@ -1044,10 +1046,26 @@ NEWLINE ("\r"|"\n"|"\r\n")
goto restart;
}
<ST_IN_SCRIPTING>";" {
return T_SEMICOLON;
}
<ST_IN_SCRIPTING>"," {
return T_COMMA;
}
<ST_IN_SCRIPTING>"." {
return T_DOT;
}
<ST_IN_SCRIPTING>"::" {
return T_PAAMAYIM_NEKUDOTAYIM;
}
<ST_IN_SCRIPTING>":" {
return T_COLON;
}
<ST_IN_SCRIPTING>"\\" {
return T_NS_SEPARATOR;
}
@@ -1260,18 +1278,39 @@ NEWLINE ("\r"|"\n"|"\r\n")
return T_IS_EQUAL;
}
<ST_IN_SCRIPTING>"=" {
return T_EQUAL;
}
<ST_IN_SCRIPTING>"!="|"<>" {
return T_IS_NOT_EQUAL;
}
<ST_IN_SCRIPTING>"!" {
return T_BOOL_NOT;
}
<ST_IN_SCRIPTING>"~" {
return T_BW_NOT;
}
<ST_IN_SCRIPTING>"<=" {
return T_IS_SMALLER_OR_EQUAL;
}
<ST_IN_SCRIPTING>"<" {
return T_IS_SMALLER;
}
<ST_IN_SCRIPTING>">=" {
return T_IS_GREATER_OR_EQUAL;
}
<ST_IN_SCRIPTING>">" {
return T_IS_GREATER;
}
<ST_IN_SCRIPTING>"+=" {
return T_PLUS_EQUAL;
}
@@ -1344,14 +1383,65 @@ NEWLINE ("\r"|"\n"|"\r\n")
return T_SR;
}
<ST_IN_SCRIPTING>{TOKENS} {
return yytext[0];
<ST_IN_SCRIPTING>"|" {
return T_BW_OR;
}
<ST_IN_SCRIPTING>"&" {
return T_BW_AND;
}
<ST_IN_SCRIPTING>"^" {
return T_BW_XOR;
}
<ST_IN_SCRIPTING>"+" {
return T_PLUS;
}
<ST_IN_SCRIPTING>"-" {
return T_MINUS;
}
<ST_IN_SCRIPTING>"/" {
return T_DIV;
}
<ST_IN_SCRIPTING>"*" {
return T_MULT;
}
<ST_IN_SCRIPTING>"%" {
return T_MOD;
}
<ST_IN_SCRIPTING>"(" {
return T_LPAREN;
}
<ST_IN_SCRIPTING>")" {
return T_RPAREN;
}
<ST_IN_SCRIPTING>"[" {
return T_LBRACKET;
}
<ST_IN_SCRIPTING>"]" {
return T_RBRACKET;
}
<ST_IN_SCRIPTING>"@" {
return T_AT;
}
<ST_IN_SCRIPTING>"$" {
return T_DOLLAR;
}
<ST_IN_SCRIPTING>"{" {
yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
return '{';
return T_LBRACE;
}
@@ -1366,7 +1456,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
if (!zend_stack_is_empty(&SCNG(state_stack))) {
yy_pop_state(TSRMLS_C);
}
return '}';
return T_RBRACE;
}
@@ -1508,7 +1598,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
}
<ST_IN_SCRIPTING>"__LINE__" {
zendlval->value.lval = CG(zend_lineno);
zendlval->value.lval = *lineno;
zendlval->type = IS_LONG;
return T_LINE;
}
@@ -1734,14 +1824,13 @@ inline_html:
return T_VARIABLE;
}
<ST_VAR_OFFSET>"]" {
yy_pop_state(TSRMLS_C);
return ']';
<ST_VAR_OFFSET>"[" {
return T_LBRACKET;
}
<ST_VAR_OFFSET>{TOKENS}|[{}"`] {
/* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */
return yytext[0];
<ST_VAR_OFFSET>"]" {
yy_pop_state(TSRMLS_C);
return T_RBRACKET;
}
<ST_VAR_OFFSET>[ \n\r\t\\'#] {
@@ -1751,6 +1840,22 @@ inline_html:
return T_ENCAPSED_AND_WHITESPACE;
}
<ST_VAR_OFFSET>'"' {
return T_QUOTE;
}
<ST_VAR_OFFSET>'{' {
return T_LBRACE;
}
<ST_VAR_OFFSET>'}' {
return T_RBRACE;
}
<ST_VAR_OFFSET>'`' {
return T_BACKQUOTE;
}
<ST_IN_SCRIPTING,ST_VAR_OFFSET>{LABEL} {
zend_copy_value(zendlval, yytext, yyleng);
zendlval->type = IS_STRING;
@@ -1767,7 +1872,7 @@ inline_html:
}
/* fall through */
case '\n':
CG(zend_lineno)++;
++(*lineno);
break;
case '%':
if (!CG(asp_tags)) {
@@ -1844,7 +1949,7 @@ inline_html:
return T_CLOSE_TAG; /* implicit ';' at php-end tag */
} else {
yyless(1);
return yytext[0];
return T_MOD;
}
}
@@ -1901,7 +2006,7 @@ inline_html:
}
if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
CG(zend_lineno)++;
++(*lineno);
}
s++;
}
@@ -1927,7 +2032,7 @@ inline_html:
switch (*YYCURSOR++) {
case '"':
yyleng = YYCURSOR - SCNG(yy_text);
zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"' TSRMLS_CC);
zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"', lineno TSRMLS_CC);
return T_CONSTANT_ENCAPSED_STRING;
case '$':
if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') {
@@ -1958,7 +2063,7 @@ inline_html:
YYCURSOR = SCNG(yy_text) + yyleng;
BEGIN(ST_DOUBLE_QUOTES);
return '"';
return T_QUOTE;
}
@@ -1970,7 +2075,7 @@ inline_html:
Z_STRVAL_P(zendlval) = CG(heredoc);
Z_STRLEN_P(zendlval) = CG(heredoc_len);
CG(zend_lineno)++;
++(*lineno);
CG(heredoc_len) = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0);
s = yytext+bprefix+3;
while ((*s == ' ') || (*s == '\t')) {
@@ -2013,7 +2118,7 @@ inline_html:
<ST_IN_SCRIPTING>[`] {
BEGIN(ST_BACKQUOTE);
return '`';
return T_BACKQUOTE;
}
@@ -2040,12 +2145,12 @@ inline_html:
<ST_DOUBLE_QUOTES>["] {
BEGIN(ST_IN_SCRIPTING);
return '"';
return T_QUOTE;
}
<ST_BACKQUOTE>[`] {
BEGIN(ST_IN_SCRIPTING);
return '`';
return T_BACKQUOTE;
}
@@ -2094,7 +2199,7 @@ inline_html:
double_quotes_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
zend_scan_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC);
zend_scan_escape_string(zendlval, yytext, yyleng, '"', lineno TSRMLS_CC);
return T_ENCAPSED_AND_WHITESPACE;
}
@@ -2136,7 +2241,7 @@ double_quotes_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
zend_scan_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC);
zend_scan_escape_string(zendlval, yytext, yyleng, '`', lineno TSRMLS_CC);
return T_ENCAPSED_AND_WHITESPACE;
}
@@ -2208,7 +2313,7 @@ double_quotes_scan_done:
heredoc_scan_done:
yyleng = YYCURSOR - SCNG(yy_text);
zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0 TSRMLS_CC);
zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0, lineno TSRMLS_CC);
return T_ENCAPSED_AND_WHITESPACE;
}
@@ -2268,7 +2373,6 @@ nowdoc_scan_done:
return T_ENCAPSED_AND_WHITESPACE;
}
<ST_IN_SCRIPTING,ST_VAR_OFFSET>{ANY_CHAR} {
if (YYCURSOR > YYLIMIT) {
return 0;
+1 -1
View File
@@ -1,4 +1,4 @@
/* Generated by re2c 0.13.5 on Mon May 24 14:07:57 2010 */
/* Generated by re2c 0.13.5 */
#line 3 "Zend/zend_language_scanner_defs.h"
enum YYCONDTYPE {
-11
View File
@@ -2085,17 +2085,6 @@ AC_DEFUN([PHP_PROG_AWK], [
PHP_SUBST(AWK)
])
dnl
dnl PHP_PROG_BISON
dnl
dnl Search for bison and check it's version
dnl
AC_DEFUN([PHP_PROG_BISON], [
AC_PROG_YACC
LIBZEND_BISON_CHECK
PHP_SUBST(YACC)
])
dnl
dnl PHP_PROG_LEX
dnl
+3 -10
View File
@@ -148,18 +148,8 @@ PHP_RUNPATH_SWITCH
dnl Checks for some support/generator progs
PHP_PROG_AWK
PHP_PROG_BISON
PHP_PROG_RE2C
dnl Check if bison generated files exist when bison does not..
case $php_cv_bison_version in
""|invalid[)]
if ! test -f "$abs_srcdir/Zend/zend_language_parser.h" || ! test -f "$abs_srcdir/Zend/zend_language_parser.c" ; then
AC_MSG_ERROR([bison is required to build PHP/Zend when building a SVN checkout!])
fi
;;
esac
PHP_ARG_ENABLE(re2c-cgoto, whether to enable computed goto gcc extension with re2c,
[ --enable-re2c-cgoto Enable -g flag to re2c to use computed goto gcc extension], no, no)
@@ -1053,9 +1043,12 @@ LIBZEND_OTHER_CHECKS
if test "$ZEND_MAINTAINER_ZTS" = "yes"; then
AC_DEFINE(ZTS,1,[ ])
PHP_THREAD_SAFETY=yes
LEMON_FLAGS="-l -q D=ZTS"
else
PHP_THREAD_SAFETY=no
LEMON_FLAGS="-l -q"
fi
PHP_SUBST(LEMON_FLAGS)
INCLUDES="$INCLUDES -I\$(top_builddir)/TSRM"
INCLUDES="$INCLUDES -I\$(top_builddir)/Zend"
+3 -1
View File
@@ -192,7 +192,9 @@ stdint.h is available, include it; it may define INT64_MAX. Systems that do not
have stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set
by "configure". */
#if HAVE_STDINT_H
#ifdef PHP_WIN32
#include "win32/php_stdint.h"
#elif HAVE_STDINT_H
#include <stdint.h>
#elif HAVE_INTTYPES_H
#include <inttypes.h>
+52 -21
View File
@@ -110,12 +110,12 @@ static void tokenize(zval *return_value TSRMLS_DC)
array_init(return_value);
ZVAL_NULL(&token);
while ((token_type = lex_scan(&token TSRMLS_CC))) {
while ((token_type = lex_scan(&token, &token_line TSRMLS_CC))) {
destroy = 1;
switch (token_type) {
case T_CLOSE_TAG:
if (zendtext[zendleng - 1] != '>') {
CG(zend_lineno)++;
++token_line;
}
case T_OPEN_TAG:
case T_OPEN_TAG_WITH_ECHO:
@@ -126,31 +126,62 @@ static void tokenize(zval *return_value TSRMLS_DC)
break;
}
if (token_type >= 256) {
MAKE_STD_ZVAL(keyword);
array_init(keyword);
add_next_index_long(keyword, token_type);
if (token_type == T_END_HEREDOC) {
if (CG(increment_lineno)) {
token_line = ++CG(zend_lineno);
CG(increment_lineno) = 0;
switch (token_type) {
case T_DOT:
case T_AT:
case T_BOOL_NOT:
case T_BW_AND:
case T_BW_OR:
case T_BW_XOR:
case T_BW_NOT:
case T_PLUS:
case T_MINUS:
case T_MOD:
case T_DIV:
case T_MULT:
case T_SEMICOLON:
case T_COLON:
case T_COMMA:
case T_LBRACE:
case T_RBRACE:
case T_LBRACKET:
case T_RBRACKET:
case T_LPAREN:
case T_RPAREN:
case T_EQUAL:
case T_QUOTE:
case T_BACKQUOTE:
case T_QUESTION_MARK:
case T_IS_GREATER:
case T_DOLLAR:
case T_IS_SMALLER:
add_next_index_stringl(return_value, (char *)zendtext, zendleng, 1);
break;
default:
MAKE_STD_ZVAL(keyword);
array_init(keyword);
add_next_index_long(keyword, token_type);
if (token_type == T_END_HEREDOC) {
add_next_index_stringl(keyword, Z_STRVAL(token), Z_STRLEN(token), 1);
efree(Z_STRVAL(token));
} else {
add_next_index_stringl(keyword, (char *)zendtext, zendleng, 1);
}
add_next_index_stringl(keyword, Z_STRVAL(token), Z_STRLEN(token), 1);
efree(Z_STRVAL(token));
} else {
add_next_index_stringl(keyword, (char *)zendtext, zendleng, 1);
}
add_next_index_long(keyword, token_line);
add_next_index_zval(return_value, keyword);
} else {
add_next_index_stringl(return_value, (char *)zendtext, zendleng, 1);
add_next_index_long(keyword, CG(zend_lineno));
add_next_index_zval(return_value, keyword);
break;
}
CG(zend_lineno) = token_line;
if (CG(increment_lineno)) {
++CG(zend_lineno);
CG(increment_lineno) = 0;
token_line = CG(zend_lineno);
}
if (destroy && Z_TYPE(token) != IS_NULL) {
zval_dtor(&token);
}
ZVAL_NULL(&token);
token_line = CG(zend_lineno);
}
}
+245 -169
View File
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2010 The PHP Group |
| Copyright (c) 1997-2008 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -29,129 +29,167 @@
void tokenizer_register_constants(INIT_FUNC_ARGS) {
REGISTER_LONG_CONSTANT("T_REQUIRE_ONCE", T_REQUIRE_ONCE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_REQUIRE", T_REQUIRE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_EVAL", T_EVAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INCLUDE_ONCE", T_INCLUDE_ONCE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INCLUDE", T_INCLUDE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INCLUDE_ONCE", T_INCLUDE_ONCE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_EVAL", T_EVAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_REQUIRE", T_REQUIRE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_REQUIRE_ONCE", T_REQUIRE_ONCE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_COMMA", T_COMMA, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LOGICAL_OR", T_LOGICAL_OR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LOGICAL_XOR", T_LOGICAL_XOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LOGICAL_AND", T_LOGICAL_AND, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PRINT", T_PRINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SR_EQUAL", T_SR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SL_EQUAL", T_SL_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_XOR_EQUAL", T_XOR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OR_EQUAL", T_OR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_AND_EQUAL", T_AND_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MOD_EQUAL", T_MOD_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CONCAT_EQUAL", T_CONCAT_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DIV_EQUAL", T_DIV_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MUL_EQUAL", T_MUL_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MINUS_EQUAL", T_MINUS_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_EQUAL", T_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PLUS_EQUAL", T_PLUS_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MINUS_EQUAL", T_MINUS_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MUL_EQUAL", T_MUL_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DIV_EQUAL", T_DIV_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CONCAT_EQUAL", T_CONCAT_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MOD_EQUAL", T_MOD_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_AND_EQUAL", T_AND_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OR_EQUAL", T_OR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_XOR_EQUAL", T_XOR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SL_EQUAL", T_SL_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SR_EQUAL", T_SR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_QUESTION_MARK", T_QUESTION_MARK, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_COLON", T_COLON, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BOOLEAN_OR", T_BOOLEAN_OR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BOOLEAN_AND", T_BOOLEAN_AND, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_NOT_IDENTICAL", T_IS_NOT_IDENTICAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_IDENTICAL", T_IS_IDENTICAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_NOT_EQUAL", T_IS_NOT_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BW_OR", T_BW_OR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BW_XOR", T_BW_XOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BW_AND", T_BW_AND, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_EQUAL", T_IS_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_GREATER_OR_EQUAL", T_IS_GREATER_OR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_NOT_EQUAL", T_IS_NOT_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_IDENTICAL", T_IS_IDENTICAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_NOT_IDENTICAL", T_IS_NOT_IDENTICAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_SMALLER", T_IS_SMALLER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_SMALLER_OR_EQUAL", T_IS_SMALLER_OR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SR", T_SR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_GREATER", T_IS_GREATER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IS_GREATER_OR_EQUAL", T_IS_GREATER_OR_EQUAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SL", T_SL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SR", T_SR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PLUS", T_PLUS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MINUS", T_MINUS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOT", T_DOT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MULT", T_MULT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DIV", T_DIV, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_MOD", T_MOD, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BOOL_NOT", T_BOOL_NOT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INSTANCEOF", T_INSTANCEOF, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_UNSET_CAST", T_UNSET_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BOOL_CAST", T_BOOL_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OBJECT_CAST", T_OBJECT_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ARRAY_CAST", T_ARRAY_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_STRING_CAST", T_STRING_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOUBLE_CAST", T_DOUBLE_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INT_CAST", T_INT_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DEC", T_DEC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BW_NOT", T_BW_NOT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INC", T_INC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CLONE", T_CLONE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DEC", T_DEC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INT_CAST", T_INT_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NUMERIC_CAST", T_NUMERIC_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SCALAR_CAST", T_SCALAR_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOUBLE_CAST", T_DOUBLE_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_STRING_CAST", T_STRING_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ARRAY_CAST", T_ARRAY_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OBJECT_CAST", T_OBJECT_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BOOL_CAST", T_BOOL_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_UNSET_CAST", T_UNSET_CAST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_AT", T_AT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_RBRACKET", T_RBRACKET, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NEW", T_NEW, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CLONE", T_CLONE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_EXIT", T_EXIT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IF", T_IF, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ELSEIF", T_ELSEIF, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ELSE", T_ELSE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDIF", T_ENDIF, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LNUMBER", T_LNUMBER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DNUMBER", T_DNUMBER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_STATIC", T_STATIC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ABSTRACT", T_ABSTRACT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FINAL", T_FINAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PRIVATE", T_PRIVATE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PROTECTED", T_PROTECTED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PUBLIC", T_PUBLIC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OPEN_TAG", T_OPEN_TAG, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OPEN_TAG_WITH_ECHO", T_OPEN_TAG_WITH_ECHO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_WHITESPACE", T_WHITESPACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_COMMENT", T_COMMENT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CLOSE_TAG", T_CLOSE_TAG, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOC_COMMENT", T_DOC_COMMENT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_STRING", T_STRING, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_STRING_VARNAME", T_STRING_VARNAME, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_VARIABLE", T_VARIABLE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NUM_STRING", T_NUM_STRING, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INLINE_HTML", T_INLINE_HTML, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CHARACTER", T_CHARACTER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BAD_CHARACTER", T_BAD_CHARACTER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENCAPSED_AND_WHITESPACE", T_ENCAPSED_AND_WHITESPACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CONSTANT_ENCAPSED_STRING", T_CONSTANT_ENCAPSED_STRING, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ECHO", T_ECHO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DO", T_DO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_WHILE", T_WHILE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDWHILE", T_ENDWHILE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FOR", T_FOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDFOR", T_ENDFOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FOREACH", T_FOREACH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDFOREACH", T_ENDFOREACH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DECLARE", T_DECLARE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDDECLARE", T_ENDDECLARE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NS_SEPARATOR", T_NS_SEPARATOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NAMESPACE", T_NAMESPACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LBRACE", T_LBRACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_HALT_COMPILER", T_HALT_COMPILER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LPAREN", T_LPAREN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_RPAREN", T_RPAREN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SEMICOLON", T_SEMICOLON, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_RBRACE", T_RBRACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_USE", T_USE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_AS", T_AS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SWITCH", T_SWITCH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CONST", T_CONST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDWHILE", T_ENDWHILE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_WHILE", T_WHILE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DO", T_DO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDFOR", T_ENDFOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FOR", T_FOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDSWITCH", T_ENDSWITCH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CASE", T_CASE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DEFAULT", T_DEFAULT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SWITCH", T_SWITCH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDDECLARE", T_ENDDECLARE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DECLARE", T_DECLARE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOUBLE_ARROW", T_DOUBLE_ARROW, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENDFOREACH", T_ENDFOREACH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FOREACH", T_FOREACH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CATCH", T_CATCH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_VARIABLE", T_VARIABLE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_TRY", T_TRY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_GLOBAL", T_GLOBAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ECHO", T_ECHO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_UNSET", T_UNSET, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BREAK", T_BREAK, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CONTINUE", T_CONTINUE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_GOTO", T_GOTO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FUNCTION", T_FUNCTION, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CONST", T_CONST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_RETURN", T_RETURN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_TRY", T_TRY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CATCH", T_CATCH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INLINE_HTML", T_INLINE_HTML, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_THROW", T_THROW, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_USE", T_USE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_GLOBAL", T_GLOBAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PUBLIC", T_PUBLIC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PROTECTED", T_PROTECTED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PRIVATE", T_PRIVATE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FINAL", T_FINAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ABSTRACT", T_ABSTRACT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_STATIC", T_STATIC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_VAR", T_VAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_UNSET", T_UNSET, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ISSET", T_ISSET, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_EMPTY", T_EMPTY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_HALT_COMPILER", T_HALT_COMPILER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_GOTO", T_GOTO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CLASS", T_CLASS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INTERFACE", T_INTERFACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_TRAIT", T_TRAIT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_EXTENDS", T_EXTENDS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INTERFACE", T_INTERFACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IMPLEMENTS", T_IMPLEMENTS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OBJECT_OPERATOR", T_OBJECT_OPERATOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOUBLE_ARROW", T_DOUBLE_ARROW, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LIST", T_LIST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ARRAY", T_ARRAY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BOOL_HINT", T_BOOL_HINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_STRING_HINT", T_STRING_HINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INT_HINT", T_INT_HINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOUBLE_HINT", T_DOUBLE_HINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_RESOURCE_HINT", T_RESOURCE_HINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OBJECT_HINT", T_OBJECT_HINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_SCALAR_HINT", T_SCALAR_HINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NUMERIC_HINT", T_NUMERIC_HINT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOLLAR", T_DOLLAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INSTEADOF", T_INSTEADOF, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PAAMAYIM_NEKUDOTAYIM", T_PAAMAYIM_NEKUDOTAYIM, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_VAR", T_VAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LIST", T_LIST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_BACKQUOTE", T_BACKQUOTE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FUNCTION", T_FUNCTION, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OBJECT_OPERATOR", T_OBJECT_OPERATOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ENCAPSED_AND_WHITESPACE", T_ENCAPSED_AND_WHITESPACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LNUMBER", T_LNUMBER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DNUMBER", T_DNUMBER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CONSTANT_ENCAPSED_STRING", T_CONSTANT_ENCAPSED_STRING, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LINE", T_LINE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FILE", T_FILE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DIR", T_DIR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CLASS_C", T_CLASS_C, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_METHOD_C", T_METHOD_C, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FUNC_C", T_FUNC_C, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LINE", T_LINE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_FILE", T_FILE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_COMMENT", T_COMMENT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOC_COMMENT", T_DOC_COMMENT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OPEN_TAG", T_OPEN_TAG, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_OPEN_TAG_WITH_ECHO", T_OPEN_TAG_WITH_ECHO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CLOSE_TAG", T_CLOSE_TAG, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_WHITESPACE", T_WHITESPACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NS_C", T_NS_C, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_START_HEREDOC", T_START_HEREDOC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_END_HEREDOC", T_END_HEREDOC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_STRING_VARNAME", T_STRING_VARNAME, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_QUOTE", T_QUOTE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_LBRACKET", T_LBRACKET, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOLLAR_OPEN_CURLY_BRACES", T_DOLLAR_OPEN_CURLY_BRACES, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_CURLY_OPEN", T_CURLY_OPEN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_PAAMAYIM_NEKUDOTAYIM", T_PAAMAYIM_NEKUDOTAYIM, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NAMESPACE", T_NAMESPACE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NS_C", T_NS_C, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DIR", T_DIR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NS_SEPARATOR", T_NS_SEPARATOR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NUM_STRING", T_NUM_STRING, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_ISSET", T_ISSET, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_EMPTY", T_EMPTY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_DOUBLE_COLON", T_PAAMAYIM_NEKUDOTAYIM, CONST_CS | CONST_PERSISTENT);
}
@@ -159,129 +197,167 @@ char *get_token_type_name(int token_type)
{
switch (token_type) {
case T_REQUIRE_ONCE: return "T_REQUIRE_ONCE";
case T_REQUIRE: return "T_REQUIRE";
case T_EVAL: return "T_EVAL";
case T_INCLUDE_ONCE: return "T_INCLUDE_ONCE";
case T_INCLUDE: return "T_INCLUDE";
case T_INCLUDE_ONCE: return "T_INCLUDE_ONCE";
case T_EVAL: return "T_EVAL";
case T_REQUIRE: return "T_REQUIRE";
case T_REQUIRE_ONCE: return "T_REQUIRE_ONCE";
case T_COMMA: return "T_COMMA";
case T_LOGICAL_OR: return "T_LOGICAL_OR";
case T_LOGICAL_XOR: return "T_LOGICAL_XOR";
case T_LOGICAL_AND: return "T_LOGICAL_AND";
case T_PRINT: return "T_PRINT";
case T_SR_EQUAL: return "T_SR_EQUAL";
case T_SL_EQUAL: return "T_SL_EQUAL";
case T_XOR_EQUAL: return "T_XOR_EQUAL";
case T_OR_EQUAL: return "T_OR_EQUAL";
case T_AND_EQUAL: return "T_AND_EQUAL";
case T_MOD_EQUAL: return "T_MOD_EQUAL";
case T_CONCAT_EQUAL: return "T_CONCAT_EQUAL";
case T_DIV_EQUAL: return "T_DIV_EQUAL";
case T_MUL_EQUAL: return "T_MUL_EQUAL";
case T_MINUS_EQUAL: return "T_MINUS_EQUAL";
case T_EQUAL: return "T_EQUAL";
case T_PLUS_EQUAL: return "T_PLUS_EQUAL";
case T_MINUS_EQUAL: return "T_MINUS_EQUAL";
case T_MUL_EQUAL: return "T_MUL_EQUAL";
case T_DIV_EQUAL: return "T_DIV_EQUAL";
case T_CONCAT_EQUAL: return "T_CONCAT_EQUAL";
case T_MOD_EQUAL: return "T_MOD_EQUAL";
case T_AND_EQUAL: return "T_AND_EQUAL";
case T_OR_EQUAL: return "T_OR_EQUAL";
case T_XOR_EQUAL: return "T_XOR_EQUAL";
case T_SL_EQUAL: return "T_SL_EQUAL";
case T_SR_EQUAL: return "T_SR_EQUAL";
case T_QUESTION_MARK: return "T_QUESTION_MARK";
case T_COLON: return "T_COLON";
case T_BOOLEAN_OR: return "T_BOOLEAN_OR";
case T_BOOLEAN_AND: return "T_BOOLEAN_AND";
case T_IS_NOT_IDENTICAL: return "T_IS_NOT_IDENTICAL";
case T_IS_IDENTICAL: return "T_IS_IDENTICAL";
case T_IS_NOT_EQUAL: return "T_IS_NOT_EQUAL";
case T_BW_OR: return "T_BW_OR";
case T_BW_XOR: return "T_BW_XOR";
case T_BW_AND: return "T_BW_AND";
case T_IS_EQUAL: return "T_IS_EQUAL";
case T_IS_GREATER_OR_EQUAL: return "T_IS_GREATER_OR_EQUAL";
case T_IS_NOT_EQUAL: return "T_IS_NOT_EQUAL";
case T_IS_IDENTICAL: return "T_IS_IDENTICAL";
case T_IS_NOT_IDENTICAL: return "T_IS_NOT_IDENTICAL";
case T_IS_SMALLER: return "T_IS_SMALLER";
case T_IS_SMALLER_OR_EQUAL: return "T_IS_SMALLER_OR_EQUAL";
case T_SR: return "T_SR";
case T_IS_GREATER: return "T_IS_GREATER";
case T_IS_GREATER_OR_EQUAL: return "T_IS_GREATER_OR_EQUAL";
case T_SL: return "T_SL";
case T_SR: return "T_SR";
case T_PLUS: return "T_PLUS";
case T_MINUS: return "T_MINUS";
case T_DOT: return "T_DOT";
case T_MULT: return "T_MULT";
case T_DIV: return "T_DIV";
case T_MOD: return "T_MOD";
case T_BOOL_NOT: return "T_BOOL_NOT";
case T_INSTANCEOF: return "T_INSTANCEOF";
case T_UNSET_CAST: return "T_UNSET_CAST";
case T_BOOL_CAST: return "T_BOOL_CAST";
case T_OBJECT_CAST: return "T_OBJECT_CAST";
case T_ARRAY_CAST: return "T_ARRAY_CAST";
case T_STRING_CAST: return "T_STRING_CAST";
case T_DOUBLE_CAST: return "T_DOUBLE_CAST";
case T_INT_CAST: return "T_INT_CAST";
case T_DEC: return "T_DEC";
case T_BW_NOT: return "T_BW_NOT";
case T_INC: return "T_INC";
case T_CLONE: return "T_CLONE";
case T_DEC: return "T_DEC";
case T_INT_CAST: return "T_INT_CAST";
case T_NUMERIC_CAST: return "T_NUMERIC_CAST";
case T_SCALAR_CAST: return "T_SCALAR_CAST";
case T_DOUBLE_CAST: return "T_DOUBLE_CAST";
case T_STRING_CAST: return "T_STRING_CAST";
case T_ARRAY_CAST: return "T_ARRAY_CAST";
case T_OBJECT_CAST: return "T_OBJECT_CAST";
case T_BOOL_CAST: return "T_BOOL_CAST";
case T_UNSET_CAST: return "T_UNSET_CAST";
case T_AT: return "T_AT";
case T_RBRACKET: return "T_RBRACKET";
case T_NEW: return "T_NEW";
case T_CLONE: return "T_CLONE";
case T_EXIT: return "T_EXIT";
case T_IF: return "T_IF";
case T_ELSEIF: return "T_ELSEIF";
case T_ELSE: return "T_ELSE";
case T_ENDIF: return "T_ENDIF";
case T_LNUMBER: return "T_LNUMBER";
case T_DNUMBER: return "T_DNUMBER";
case T_STATIC: return "T_STATIC";
case T_ABSTRACT: return "T_ABSTRACT";
case T_FINAL: return "T_FINAL";
case T_PRIVATE: return "T_PRIVATE";
case T_PROTECTED: return "T_PROTECTED";
case T_PUBLIC: return "T_PUBLIC";
case T_OPEN_TAG: return "T_OPEN_TAG";
case T_OPEN_TAG_WITH_ECHO: return "T_OPEN_TAG_WITH_ECHO";
case T_WHITESPACE: return "T_WHITESPACE";
case T_COMMENT: return "T_COMMENT";
case T_CLOSE_TAG: return "T_CLOSE_TAG";
case T_DOC_COMMENT: return "T_DOC_COMMENT";
case T_STRING: return "T_STRING";
case T_STRING_VARNAME: return "T_STRING_VARNAME";
case T_VARIABLE: return "T_VARIABLE";
case T_NUM_STRING: return "T_NUM_STRING";
case T_INLINE_HTML: return "T_INLINE_HTML";
case T_CHARACTER: return "T_CHARACTER";
case T_BAD_CHARACTER: return "T_BAD_CHARACTER";
case T_ENCAPSED_AND_WHITESPACE: return "T_ENCAPSED_AND_WHITESPACE";
case T_CONSTANT_ENCAPSED_STRING: return "T_CONSTANT_ENCAPSED_STRING";
case T_ECHO: return "T_ECHO";
case T_DO: return "T_DO";
case T_WHILE: return "T_WHILE";
case T_ENDWHILE: return "T_ENDWHILE";
case T_FOR: return "T_FOR";
case T_ENDFOR: return "T_ENDFOR";
case T_FOREACH: return "T_FOREACH";
case T_ENDFOREACH: return "T_ENDFOREACH";
case T_DECLARE: return "T_DECLARE";
case T_ENDDECLARE: return "T_ENDDECLARE";
case T_NS_SEPARATOR: return "T_NS_SEPARATOR";
case T_NAMESPACE: return "T_NAMESPACE";
case T_LBRACE: return "T_LBRACE";
case T_HALT_COMPILER: return "T_HALT_COMPILER";
case T_LPAREN: return "T_LPAREN";
case T_RPAREN: return "T_RPAREN";
case T_SEMICOLON: return "T_SEMICOLON";
case T_RBRACE: return "T_RBRACE";
case T_USE: return "T_USE";
case T_AS: return "T_AS";
case T_SWITCH: return "T_SWITCH";
case T_CONST: return "T_CONST";
case T_ENDWHILE: return "T_ENDWHILE";
case T_WHILE: return "T_WHILE";
case T_DO: return "T_DO";
case T_ENDFOR: return "T_ENDFOR";
case T_FOR: return "T_FOR";
case T_ENDSWITCH: return "T_ENDSWITCH";
case T_CASE: return "T_CASE";
case T_DEFAULT: return "T_DEFAULT";
case T_SWITCH: return "T_SWITCH";
case T_ENDDECLARE: return "T_ENDDECLARE";
case T_DECLARE: return "T_DECLARE";
case T_DOUBLE_ARROW: return "T_DOUBLE_ARROW";
case T_ENDFOREACH: return "T_ENDFOREACH";
case T_FOREACH: return "T_FOREACH";
case T_CATCH: return "T_CATCH";
case T_VARIABLE: return "T_VARIABLE";
case T_TRY: return "T_TRY";
case T_GLOBAL: return "T_GLOBAL";
case T_ECHO: return "T_ECHO";
case T_UNSET: return "T_UNSET";
case T_BREAK: return "T_BREAK";
case T_CONTINUE: return "T_CONTINUE";
case T_GOTO: return "T_GOTO";
case T_FUNCTION: return "T_FUNCTION";
case T_CONST: return "T_CONST";
case T_RETURN: return "T_RETURN";
case T_TRY: return "T_TRY";
case T_CATCH: return "T_CATCH";
case T_INLINE_HTML: return "T_INLINE_HTML";
case T_THROW: return "T_THROW";
case T_USE: return "T_USE";
case T_GLOBAL: return "T_GLOBAL";
case T_PUBLIC: return "T_PUBLIC";
case T_PROTECTED: return "T_PROTECTED";
case T_PRIVATE: return "T_PRIVATE";
case T_FINAL: return "T_FINAL";
case T_ABSTRACT: return "T_ABSTRACT";
case T_STATIC: return "T_STATIC";
case T_VAR: return "T_VAR";
case T_UNSET: return "T_UNSET";
case T_ISSET: return "T_ISSET";
case T_EMPTY: return "T_EMPTY";
case T_HALT_COMPILER: return "T_HALT_COMPILER";
case T_GOTO: return "T_GOTO";
case T_CLASS: return "T_CLASS";
case T_INTERFACE: return "T_INTERFACE";
case T_TRAIT: return "T_TRAIT";
case T_EXTENDS: return "T_EXTENDS";
case T_INTERFACE: return "T_INTERFACE";
case T_IMPLEMENTS: return "T_IMPLEMENTS";
case T_OBJECT_OPERATOR: return "T_OBJECT_OPERATOR";
case T_DOUBLE_ARROW: return "T_DOUBLE_ARROW";
case T_LIST: return "T_LIST";
case T_ARRAY: return "T_ARRAY";
case T_BOOL_HINT: return "T_BOOL_HINT";
case T_STRING_HINT: return "T_STRING_HINT";
case T_INT_HINT: return "T_INT_HINT";
case T_DOUBLE_HINT: return "T_DOUBLE_HINT";
case T_RESOURCE_HINT: return "T_RESOURCE_HINT";
case T_OBJECT_HINT: return "T_OBJECT_HINT";
case T_SCALAR_HINT: return "T_SCALAR_HINT";
case T_NUMERIC_HINT: return "T_NUMERIC_HINT";
case T_DOLLAR: return "T_DOLLAR";
case T_INSTEADOF: return "T_INSTEADOF";
case T_PAAMAYIM_NEKUDOTAYIM: return "T_DOUBLE_COLON";
case T_VAR: return "T_VAR";
case T_LIST: return "T_LIST";
case T_BACKQUOTE: return "T_BACKQUOTE";
case T_FUNCTION: return "T_FUNCTION";
case T_OBJECT_OPERATOR: return "T_OBJECT_OPERATOR";
case T_ENCAPSED_AND_WHITESPACE: return "T_ENCAPSED_AND_WHITESPACE";
case T_LNUMBER: return "T_LNUMBER";
case T_DNUMBER: return "T_DNUMBER";
case T_CONSTANT_ENCAPSED_STRING: return "T_CONSTANT_ENCAPSED_STRING";
case T_LINE: return "T_LINE";
case T_FILE: return "T_FILE";
case T_DIR: return "T_DIR";
case T_CLASS_C: return "T_CLASS_C";
case T_METHOD_C: return "T_METHOD_C";
case T_FUNC_C: return "T_FUNC_C";
case T_LINE: return "T_LINE";
case T_FILE: return "T_FILE";
case T_COMMENT: return "T_COMMENT";
case T_DOC_COMMENT: return "T_DOC_COMMENT";
case T_OPEN_TAG: return "T_OPEN_TAG";
case T_OPEN_TAG_WITH_ECHO: return "T_OPEN_TAG_WITH_ECHO";
case T_CLOSE_TAG: return "T_CLOSE_TAG";
case T_WHITESPACE: return "T_WHITESPACE";
case T_NS_C: return "T_NS_C";
case T_START_HEREDOC: return "T_START_HEREDOC";
case T_END_HEREDOC: return "T_END_HEREDOC";
case T_STRING_VARNAME: return "T_STRING_VARNAME";
case T_QUOTE: return "T_QUOTE";
case T_LBRACKET: return "T_LBRACKET";
case T_DOLLAR_OPEN_CURLY_BRACES: return "T_DOLLAR_OPEN_CURLY_BRACES";
case T_CURLY_OPEN: return "T_CURLY_OPEN";
case T_PAAMAYIM_NEKUDOTAYIM: return "T_DOUBLE_COLON";
case T_NAMESPACE: return "T_NAMESPACE";
case T_NS_C: return "T_NS_C";
case T_DIR: return "T_DIR";
case T_NS_SEPARATOR: return "T_NS_SEPARATOR";
case T_NUM_STRING: return "T_NUM_STRING";
case T_ISSET: return "T_ISSET";
case T_EMPTY: return "T_EMPTY";
}
return "UNKNOWN";
+4889
View File
File diff suppressed because it is too large. Load diff
+843
View File
@@ -0,0 +1,843 @@
/* Driver template for the LEMON parser generator.
** The author disclaims copyright to this source code.
*/
/* First off, code is included that follows the "include" declaration
** in the input grammar file. */
#include <stdio.h>
%%
/* Next is all token values, in a form suitable for use by makeheaders.
** This section will be null unless lemon is run with the -m switch.
*/
/*
** These constants (all generated automatically by the parser generator)
** specify the various kinds of tokens (terminals) that the parser
** understands.
**
** Each symbol here is a terminal symbol in the grammar.
*/
%%
/* Make sure the INTERFACE macro is defined.
*/
#ifndef INTERFACE
# define INTERFACE 1
#endif
/* The next thing included is series of defines which control
** various aspects of the generated parser.
** YYCODETYPE is the data type used for storing terminal
** and nonterminal numbers. "unsigned char" is
** used if there are fewer than 250 terminals
** and nonterminals. "int" is used otherwise.
** YYNOCODE is a number of type YYCODETYPE which corresponds
** to no legal terminal or nonterminal number. This
** number is used to fill in empty slots of the hash
** table.
** 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.
** YYACTIONTYPE is the data type used for storing terminal
** and nonterminal numbers. "unsigned char" is
** used if there are fewer than 250 rules and
** states combined. "int" is used otherwise.
** ParseTOKENTYPE is the data type used for minor tokens given
** directly to the parser from the tokenizer.
** YYMINORTYPE is the data type used for all minor tokens.
** This is typically a union of many types, one of
** which is ParseTOKENTYPE. The entry in the union
** for base tokens is called "yy0".
** YYSTACKDEPTH is the maximum depth of the parser's stack. If
** zero the stack is dynamically sized using realloc()
** ParseARG_SDECL A static variable declaration for the %extra_argument
** ParseARG_PDECL A parameter declaration for the %extra_argument
** ParseARG_STORE Code to store %extra_argument into yypParser
** ParseARG_FETCH Code to extract %extra_argument from yypParser
** YYNSTATE the combined number of states.
** YYNRULE the number of rules in the grammar
** YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing.
*/
%%
#define YY_NO_ACTION (YYNSTATE+YYNRULE+2)
#define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1)
#define YY_ERROR_ACTION (YYNSTATE+YYNRULE)
/* The yyzerominor constant is used to initialize instances of
** YYMINORTYPE objects to zero. */
static const YYMINORTYPE yyzerominor = { 0 };
/* Define the yytestcase() macro to be a no-op if is not already defined
** otherwise.
**
** Applications can choose to define yytestcase() in the %include section
** to a macro that can assist in verifying code coverage. For production
** code the yytestcase() macro should be turned off. But it is useful
** for testing.
*/
#ifndef yytestcase
# define yytestcase(X)
#endif
/* Next are the 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
** action integer.
**
** Suppose the action integer is N. Then the action is determined as
** follows
**
** 0 <= N < YYNSTATE Shift N. That is, push the lookahead
** token onto the stack and goto state N.
**
** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE.
**
** N == YYNSTATE+YYNRULE A syntax error has occurred.
**
** N == YYNSTATE+YYNRULE+1 The parser accepts its input.
**
** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused
** slots in the yy_action[] table.
**
** The action table is constructed as a single large table named yy_action[].
** Given state S and lookahead X, the action is computed as
**
** yy_action[ yy_shift_ofst[S] + X ]
**
** If the index value yy_shift_ofst[S]+X is out of range or if the value
** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S]
** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table
** and that 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 yy_reduce_ofst[] array is used in place of
** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of
** YY_SHIFT_USE_DFLT.
**
** The following are the tables generated in this section:
**
** yy_action[] A single table containing all actions.
** yy_lookahead[] A table containing the lookahead for each entry in
** yy_action. Used to detect hash collisions.
** yy_shift_ofst[] For each state, the offset into yy_action for
** shifting terminals.
** yy_reduce_ofst[] For each state, the offset into yy_action for
** shifting non-terminals after a reduce.
** yy_default[] Default action for each state.
*/
%%
#define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0]))
/* The next table maps tokens into fallback tokens. If a construct
** like the following:
**
** %fallback ID X Y Z.
**
** appears in the grammar, 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.
*/
#ifdef YYFALLBACK
static const YYCODETYPE yyFallback[] = {
%%
};
#endif /* YYFALLBACK */
/* 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.
*/
struct yyStackEntry {
YYACTIONTYPE stateno; /* The state-number */
YYCODETYPE major; /* The major token value. This is the code
** number for the token at this stack level */
YYMINORTYPE minor; /* The user-supplied minor token value. This
** is the value of the token */
};
typedef struct yyStackEntry yyStackEntry;
/* The state of the parser is completely contained in an instance of
** the following structure */
struct yyParser {
int yyidx; /* Index of top element in stack */
#ifdef YYTRACKMAXSTACKDEPTH
int yyidxMax; /* Maximum value of yyidx */
#endif
int yyerrcnt; /* Shifts left before out of the error */
ParseARG_SDECL /* A place to hold %extra_argument */
#if YYSTACKDEPTH<=0
int yystksz; /* Current side of the stack */
yyStackEntry *yystack; /* The parser's stack */
#else
yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */
#endif
};
typedef struct yyParser yyParser;
#ifndef NDEBUG
#include <stdio.h>
static FILE *yyTraceFILE = 0;
static char *yyTracePrompt = 0;
#endif /* NDEBUG */
#ifndef NDEBUG
/*
** 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
**
** Inputs:
** <ul>
** <li> A FILE* to which trace output should be written.
** If NULL, then tracing is turned off.
** <li> A prefix string written at the beginning of every
** line of trace output. If NULL, then tracing is
** turned off.
** </ul>
**
** Outputs:
** None.
*/
void ParseTrace(FILE *TraceFILE, char *zTracePrompt){
yyTraceFILE = TraceFILE;
yyTracePrompt = zTracePrompt;
if( yyTraceFILE==0 ) yyTracePrompt = 0;
else if( yyTracePrompt==0 ) yyTraceFILE = 0;
}
#endif /* NDEBUG */
#ifndef NDEBUG
/* For tracing shifts, the names of all terminals and nonterminals
** are required. The following table supplies these names */
static const char *const yyTokenName[] = {
%%
};
#endif /* NDEBUG */
#ifndef NDEBUG
/* For tracing reduce actions, the names of all rules are required.
*/
static const char *const yyRuleName[] = {
%%
};
#endif /* NDEBUG */
#if YYSTACKDEPTH<=0
/*
** Try to increase the size of the parser stack.
*/
static void yyGrowStack(yyParser *p){
int newSize;
yyStackEntry *pNew;
newSize = p->yystksz*2 + 100;
pNew = realloc(p->yystack, newSize*sizeof(pNew[0]));
if( pNew ){
p->yystack = pNew;
p->yystksz = newSize;
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sStack grows to %d entries!\n",
yyTracePrompt, p->yystksz);
}
#endif
}
}
#endif
/*
** This function allocates a new parser.
** The only argument is a pointer to a function which works like
** malloc.
**
** Inputs:
** A pointer to the function used to allocate memory.
**
** Outputs:
** A pointer to a parser. This pointer is used in subsequent calls
** to Parse and ParseFree.
*/
void *ParseAlloc(void *(*mallocProc)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)){
yyParser *pParser;
pParser = (yyParser*)(*mallocProc)( ((size_t)sizeof(yyParser)) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC);
if( pParser ){
pParser->yyidx = -1;
#ifdef YYTRACKMAXSTACKDEPTH
pParser->yyidxMax = 0;
#endif
#if YYSTACKDEPTH<=0
pParser->yystack = NULL;
pParser->yystksz = 0;
yyGrowStack(pParser);
#endif
}
return pParser;
}
/* The following function deletes the value associated with a
** symbol. The symbol can be either a terminal or nonterminal.
** "yymajor" is the symbol code, and "yypminor" is a pointer to
** the value.
*/
static zend_always_inline void yy_destructor(
yyParser *yypParser, /* The parser */
YYCODETYPE yymajor, /* Type code for object to destroy */
YYMINORTYPE *yypminor /* The object to be destroyed */
){
ParseARG_FETCH;
ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
switch( yymajor ){
/* 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
** inside the C code.
*/
%%
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.
*/
static zend_always_inline int yy_pop_parser_stack(yyParser *pParser){
YYCODETYPE yymajor;
yyStackEntry *yytos = &pParser->yystack[pParser->yyidx];
if( pParser->yyidx<0 ) return 0;
#ifndef NDEBUG
if( yyTraceFILE && pParser->yyidx>=0 ){
fprintf(yyTraceFILE,"%sPopping %s\n",
yyTracePrompt,
yyTokenName[yytos->major]);
}
#endif
yymajor = yytos->major;
yy_destructor(pParser, yymajor, &yytos->minor);
pParser->yyidx--;
return yymajor;
}
/*
** Deallocate and destroy a parser. Destructors are all called for
** all stack elements before shutting the parser down.
**
** Inputs:
** <ul>
** <li> A pointer to the parser. This should be a pointer
** obtained from ParseAlloc.
** <li> A pointer to a function used to reclaim memory obtained
** from malloc.
** </ul>
*/
void ParseFree(
void *p, /* The parser to be deleted */
void (*freeProc)(void* ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) /* Function used to reclaim memory */
){
yyParser *pParser = (yyParser*)p;
if( pParser==0 ) return;
while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser);
#if YYSTACKDEPTH<=0
free(pParser->yystack);
#endif
(*freeProc)((void*)pParser ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC);
}
/*
** Return the peak depth of the stack for a parser.
*/
#ifdef YYTRACKMAXSTACKDEPTH
int ParseStackPeak(void *p){
yyParser *pParser = (yyParser*)p;
return pParser->yyidxMax;
}
#endif
/*
** 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
** return YY_NO_ACTION.
*/
static zend_always_inline int yy_find_shift_action(
yyParser *pParser, /* The parser */
YYCODETYPE iLookAhead /* The look-ahead token */
){
int i;
int stateno = pParser->yystack[pParser->yyidx].stateno;
if( stateno>YY_SHIFT_MAX || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){
return yy_default[stateno];
}
assert( iLookAhead!=YYNOCODE );
i += iLookAhead;
if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){
if( iLookAhead>0 ){
#ifdef YYFALLBACK
YYCODETYPE iFallback; /* Fallback token */
if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
&& (iFallback = yyFallback[iLookAhead])!=0 ){
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n",
yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]);
}
#endif
return yy_find_shift_action(pParser, iFallback);
}
#endif
#ifdef YYWILDCARD
{
int j = i - iLookAhead + YYWILDCARD;
if( j>=0 && j<YY_SZ_ACTTAB && yy_lookahead[j]==YYWILDCARD ){
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[YYWILDCARD]);
}
#endif /* NDEBUG */
return yy_action[j];
}
}
#endif /* YYWILDCARD */
}
return yy_default[stateno];
}else{
return yy_action[i];
}
}
/*
** Find the appropriate action for a parser given the non-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
** return YY_NO_ACTION.
*/
static zend_always_inline int yy_find_reduce_action(
int stateno, /* Current state number */
YYCODETYPE iLookAhead /* The look-ahead token */
){
int i;
#ifdef YYERRORSYMBOL
if( stateno>YY_REDUCE_MAX ){
return yy_default[stateno];
}
#else
assert( stateno<=YY_REDUCE_MAX );
#endif
i = yy_reduce_ofst[stateno];
assert( i!=YY_REDUCE_USE_DFLT );
assert( iLookAhead!=YYNOCODE );
i += iLookAhead;
#ifdef YYERRORSYMBOL
if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){
return yy_default[stateno];
}
#else
assert( i>=0 && i<YY_SZ_ACTTAB );
assert( yy_lookahead[i]==iLookAhead );
#endif
return yy_action[i];
}
/*
** The following routine is called if the stack overflows.
*/
static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){
ParseARG_FETCH;
yypParser->yyidx--;
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
}
#endif
while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
/* Here code is inserted which will execute if the parser
** stack every overflows */
%%
ParseARG_STORE; /* Suppress warning about unused %extra_argument var */
}
/*
** Perform a shift action.
*/
static zend_always_inline void yy_shift(
yyParser *yypParser, /* The parser to be shifted */
int yyNewState, /* The new state to shift in */
int yyMajor, /* The major token to shift in */
YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */
){
yyStackEntry *yytos;
yypParser->yyidx++;
#ifdef YYTRACKMAXSTACKDEPTH
if( yypParser->yyidx>yypParser->yyidxMax ){
yypParser->yyidxMax = yypParser->yyidx;
}
#endif
#if YYSTACKDEPTH>0
if( yypParser->yyidx>=YYSTACKDEPTH ){
yyStackOverflow(yypParser, yypMinor);
return;
}
#else
if( yypParser->yyidx>=yypParser->yystksz ){
yyGrowStack(yypParser);
if( yypParser->yyidx>=yypParser->yystksz ){
yyStackOverflow(yypParser, yypMinor);
return;
}
}
#endif
yytos = &yypParser->yystack[yypParser->yyidx];
yytos->stateno = (YYACTIONTYPE)yyNewState;
yytos->major = (YYCODETYPE)yyMajor;
yytos->minor = *yypMinor;
#ifndef NDEBUG
if( yyTraceFILE && yypParser->yyidx>0 ){
int i;
fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState);
fprintf(yyTraceFILE,"%sStack:",yyTracePrompt);
for(i=1; i<=yypParser->yyidx; i++)
fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]);
fprintf(yyTraceFILE,"\n");
}
#endif
}
/* The following table contains information about every rule that
** is used during the reduce.
*/
static const struct {
YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
unsigned char nrhs; /* Number of right-hand side symbols in the rule */
} yyRuleInfo[] = {
%%
};
static zend_always_inline void yy_accept(yyParser*); /* Forward Declaration */
/*
** Perform a reduce action and the shift that must immediately
** follow the reduce.
*/
static zend_always_inline void yy_reduce(
yyParser *yypParser, /* The parser */
int yyruleno /* Number of the rule by which to reduce */
){
int yygoto; /* The next state */
int yyact; /* The next action */
YYMINORTYPE yygotominor; /* The LHS of the rule reduced */
yyStackEntry *yymsp; /* The top of the parser's stack */
int yysize; /* Amount to pop the stack */
ParseARG_FETCH;
yymsp = &yypParser->yystack[yypParser->yyidx];
#ifndef NDEBUG
if( yyTraceFILE && yyruleno>=0
&& yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt,
yyRuleName[yyruleno]);
}
#endif /* NDEBUG */
/* Silence complaints from purify about yygotominor being uninitialized
** in some cases when it is copied into the stack after the following
** switch. yygotominor is uninitialized when a rule reduces that does
** not set the value of its left-hand side nonterminal. Leaving the
** value of the nonterminal uninitialized is utterly harmless as long
** as the value is never used. So really the only thing this code
** accomplishes is to quieten purify.
**
** 2007-01-16: The wireshark project (www.wireshark.org) reports that
** without this code, their parser segfaults. I'm not sure what there
** parser is doing to make this happen. This is the second bug report
** from wireshark this week. Clearly they are stressing Lemon in ways
** that it has not been previously stressed... (SQLite ticket #2172)
*/
/*memset(&yygotominor, 0, sizeof(yygotominor));*/
yygotominor = yyzerominor;
switch( yyruleno ){
/* Beginning here are the reduction cases. A typical example
** follows:
** case 0:
** #line <lineno> <grammarfile>
** { ... } // User supplied code
** #line <lineno> <thisfile>
** break;
*/
%%
};
yygoto = yyRuleInfo[yyruleno].lhs;
yysize = yyRuleInfo[yyruleno].nrhs;
yypParser->yyidx -= yysize;
yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto);
if( yyact < YYNSTATE ){
#ifdef NDEBUG
/* If we are not debugging and the reduce action popped at least
** one element off the stack, then we can push the new element back
** onto the stack here, and skip the stack overflow test in yy_shift().
** That gives a significant speed improvement. */
if( yysize ){
yypParser->yyidx++;
yymsp -= yysize-1;
yymsp->stateno = (YYACTIONTYPE)yyact;
yymsp->major = (YYCODETYPE)yygoto;
yymsp->minor = yygotominor;
}else
#endif
{
yy_shift(yypParser,yyact,yygoto,&yygotominor);
}
}else{
assert( yyact == YYNSTATE + YYNRULE + 1 );
yy_accept(yypParser);
}
}
/*
** The following code executes when the parse fails
*/
#ifndef YYNOERRORRECOVERY
static void yy_parse_failed(
yyParser *yypParser /* The parser */
){
ParseARG_FETCH;
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
}
#endif
while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
/* Here code is inserted which will be executed whenever the
** parser fails */
%%
ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
}
#endif /* YYNOERRORRECOVERY */
/*
** The following code executes when a syntax error first occurs.
*/
static zend_always_inline void yy_syntax_error(
yyParser *yypParser, /* The parser */
int yymajor, /* The major type of the error token */
YYMINORTYPE yyminor /* The minor type of the error token */
){
ParseARG_FETCH;
#define TOKEN (yyminor.yy0)
%%
ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
}
/*
** The following is executed when the parser accepts
*/
static zend_always_inline void yy_accept(
yyParser *yypParser /* The parser */
){
ParseARG_FETCH;
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
}
#endif
while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
/* Here code is inserted which will be executed whenever the
** parser accepts */
%%
ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
}
/* The main parser program.
** The first argument is a pointer to a structure obtained from
** "ParseAlloc" which describes the current state of the parser.
** The second argument is the major token number. The third is
** the minor token. The fourth optional argument is whatever the
** user wants (and specified in the grammar) and is available for
** use by the action routines.
**
** Inputs:
** <ul>
** <li> A pointer to the parser (an opaque structure.)
** <li> The major token number.
** <li> The minor token number.
** <li> An option argument of a grammar-specified type.
** </ul>
**
** Outputs:
** None.
*/
void Parse(
void *yyp, /* The parser */
int yymajor, /* The major token code number */
ParseTOKENTYPE yyminor /* The value for the token */
ParseARG_PDECL /* Optional %extra_argument parameter */
){
YYMINORTYPE yyminorunion;
int yyact; /* The parser action. */
int yyendofinput; /* True if we are at the end of input */
#ifdef YYERRORSYMBOL
int yyerrorhit = 0; /* True if yymajor has invoked an error */
#endif
yyParser *yypParser; /* The parser */
/* (re)initialize the parser, if necessary */
yypParser = (yyParser*)yyp;
if( yypParser->yyidx<0 ){
#if YYSTACKDEPTH<=0
if( yypParser->yystksz <=0 ){
/*memset(&yyminorunion, 0, sizeof(yyminorunion));*/
yyminorunion = yyzerominor;
yyStackOverflow(yypParser, &yyminorunion);
return;
}
#endif
yypParser->yyidx = 0;
yypParser->yyerrcnt = -1;
yypParser->yystack[0].stateno = 0;
yypParser->yystack[0].major = 0;
}
yyminorunion.yy0 = yyminor;
yyendofinput = (yymajor==0);
ParseARG_STORE;
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);
}
#endif
do{
yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
if( yyact<YYNSTATE ){
assert( !yyendofinput ); /* Impossible to shift the $ token */
yy_shift(yypParser,yyact,yymajor,&yyminorunion);
yypParser->yyerrcnt--;
yymajor = YYNOCODE;
}else if( yyact < YYNSTATE + YYNRULE ){
yy_reduce(yypParser,yyact-YYNSTATE);
}else{
assert( yyact == YY_ERROR_ACTION );
#ifdef YYERRORSYMBOL
int yymx;
#endif
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt);
}
#endif
#ifdef YYERRORSYMBOL
/* A syntax error has occurred.
** The response to an error depends upon whether or not the
** grammar defines an error token "ERROR".
**
** This is what we do if the grammar does define ERROR:
**
** * Call the %syntax_error function.
**
** * Begin popping the stack until we enter a state where
** it is legal to shift the error symbol, then shift
** the error symbol.
**
** * Set the error count to three.
**
** * Begin accepting and shifting new tokens. No new error
** processing will occur until three tokens have been
** shifted successfully.
**
*/
if( yypParser->yyerrcnt<0 ){
yy_syntax_error(yypParser,yymajor,yyminorunion);
}
yymx = yypParser->yystack[yypParser->yyidx].major;
if( yymx==YYERRORSYMBOL || yyerrorhit ){
#ifndef NDEBUG
if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sDiscard input token %s\n",
yyTracePrompt,yyTokenName[yymajor]);
}
#endif
yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion);
yymajor = YYNOCODE;
}else{
while(
yypParser->yyidx >= 0 &&
yymx != YYERRORSYMBOL &&
(yyact = yy_find_reduce_action(
yypParser->yystack[yypParser->yyidx].stateno,
YYERRORSYMBOL)) >= YYNSTATE
){
yy_pop_parser_stack(yypParser);
}
if( yypParser->yyidx < 0 || yymajor==0 ){
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
yy_parse_failed(yypParser);
yymajor = YYNOCODE;
}else if( yymx!=YYERRORSYMBOL ){
YYMINORTYPE u2;
u2.YYERRSYMDT = 0;
yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2);
}
}
yypParser->yyerrcnt = 3;
yyerrorhit = 1;
#elif defined(YYNOERRORRECOVERY)
/* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
** do any kind of error recovery. Instead, simply invoke the syntax
** error routine and continue going as if nothing had happened.
**
** Applications can set this macro (for example inside %include) if
** they intend to abandon the parse upon the first syntax error seen.
*/
yy_syntax_error(yypParser,yymajor,yyminorunion);
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
yymajor = YYNOCODE;
#else /* YYERRORSYMBOL is not defined */
/* This is what we do if the grammar does not define ERROR:
**
** * Report an error message, and throw away the input token.
**
** * If the input token is $, then fail the parse.
**
** As before, subsequent error messages are suppressed until
** three input tokens have been successfully shifted.
*/
if( yypParser->yyerrcnt<=0 ){
yy_syntax_error(yypParser,yymajor,yyminorunion);
}
yypParser->yyerrcnt = 3;
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
if( yyendofinput ){
yy_parse_failed(yypParser);
}
yymajor = YYNOCODE;
#endif
}
}while( yymajor!=YYNOCODE && yypParser->yyidx>=0 );
return;
}
+5
View File
@@ -507,6 +507,11 @@ static int module_initialized = 0;
static int module_startup = 1;
static int module_shutdown = 0;
PHPAPI int php_module_initialized(void)
{
return module_initialized;
}
/* {{{ php_during_module_startup */
static int php_during_module_startup(void)
{
+1
View File
@@ -27,6 +27,7 @@
#include "SAPI.h"
BEGIN_EXTERN_C()
PHPAPI int php_module_initialized(void);
PHPAPI int php_request_startup(TSRMLS_D);
PHPAPI void php_request_shutdown(void *dummy);
PHPAPI void php_request_shutdown_for_exec(void *dummy);
+16 -6
View File
@@ -26,7 +26,9 @@ PHP_BUILD=$(PHP_BUILD)
MCFILE=$(BUILD_DIR)\wsyslog.rc
all: generated_files $(EXT_TARGETS) $(PECL_TARGETS) $(SAPI_TARGETS)
all: $(BUILD_DIR)\lemon.exe generated_files $(EXT_TARGETS) $(PECL_TARGETS) $(SAPI_TARGETS)
LEMON=$(BUILD_DIR)\lemon.exe
build_dirs: $(BUILD_DIR) $(BUILD_DIRS_SUB)
@@ -45,17 +47,17 @@ $(BUILD_DIR)\$(PHPDLL).def: $(PHP_DLL_DEF_SOURCES)
type $(PHP_DLL_DEF_SOURCES) > $(BUILD_DIR)\$(PHPDLL).def
Zend\zend_ini_parser.c Zend\zend_ini_parser.h: Zend\zend_ini_parser.y
$(BISON) --output=Zend/zend_ini_parser.c -v -d -p ini_ Zend/zend_ini_parser.y
$(LEMON) $(LEMON_FLAGS) Zend/zend_ini_parser.y
Zend\zend_language_parser.c Zend\zend_language_parser.h: Zend\zend_language_parser.y
$(BISON) --output=Zend/zend_language_parser.c -v -d -p zend Zend/zend_language_parser.y
$(LEMON) $(LEMON_FLAGS) Zend/zend_language_parser.y
!if $(RE2C) != ""
Zend\zend_ini_scanner.c: Zend\zend_ini_scanner.l
$(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l
$(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l
Zend\zend_language_scanner.c: Zend\zend_language_scanner.l
$(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l
$(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l
!endif
PHPDLL_RES=$(BUILD_DIR)\$(PHPDLL).res
@@ -97,12 +99,16 @@ clean-sapi:
@for %D in (_x $(SAPI_TARGETS)) do @if exist $(BUILD_DIR)\%D @del /F /Q $(BUILD_DIR)\%D > NUL
-@del /F /Q $(BUILD_DIR)\$(PHPDLL)
clean: clean-sapi
clean: clean-sapi clean-lemon
@echo Cleaning distribution build dirs
@for %D in (_x $(BUILD_DIRS_SUB)) do @if exist %D @del /F /Q %D\*.* > NUL
-@del /F /Q $(BUILD_DIR)\*.res $(BUILD_DIR)\*.lib $(BUILD_DIR)\*.ilk $(BUILD_DIR)\*.pdb $(BUILD_DIR)\*.exp $(PHPDEF) $(BUILD_DIR)\php-$(PHP_VERSION_STRING)-Win32.zip $(BUILD_DIR)\pecl-$(PHP_VERSION_STRING)-Win32.zip > NUL
-rd /s /q $(BUILD_DIR)\php-$(PHP_VERSION_STRING)
clean-lemon:
@echo Cleaning lemon build dirs
-@del $(BUILD_DIR)\lemon.*
clean-pecl:
@echo Cleaning PECL targets only
-rd /s /q $(BUILD_DIR)\pecl
@@ -148,6 +154,10 @@ snap: build-snap build-dist
$(BUILD_DIR)\deplister.exe: win32\build\deplister.c
$(CL) /Fo$(BUILD_DIR)\ /Fd$(BUILD_DIR)\ /Fp$(BUILD_DIR)\ /FR$(BUILD_DIR) /Fe$(BUILD_DIR)\deplister.exe win32\build\deplister.c imagehlp.lib
$(BUILD_DIR)\lemon.exe: lemon.c
$(CL) /Fo$(BUILD_DIR)\ /Fd$(BUILD_DIR)\ /Fp$(BUILD_DIR)\ /FR$(BUILD_DIR) /Fe$(BUILD_DIR)\lemon.exe lemon.c
msi-installer: dist
$(BUILD_DIR)\php.exe ..\php-installer\build-installer.php "$(BUILD_DIR)" "$(PHPDLL)" "$(SAPI_TARGETS)" "$(EXT_TARGETS)" "$(PECL_TARGETS)"
+3 -3
View File
@@ -46,9 +46,6 @@ PATH_PROG('nmake');
// we don't want to define LIB, as that will override the default library path
// that is set in that env var
PATH_PROG('lib', null, 'MAKE_LIB');
if (!PATH_PROG('bison')) {
ERROR('bison is required')
}
// There's a minimum requirement for re2c..
MINRE2C = "0.13.4";
@@ -204,6 +201,9 @@ if (PHP_DEBUG == "yes") {
if (PHP_ZTS == "yes") {
ADD_FLAG("CFLAGS", "/D ZTS=1");
DEFINE("LEMON_FLAGS", "-l -q D=ZTS");
} else {
DEFINE("LEMON_FLAGS", "-l -q");
}
DEFINE("PHP_ZTS_ARCHIVE_POSTFIX", PHP_ZTS == "yes" ? '' : "-nts");