$grammar = q { statement: 'var' ';' { $return = $item[2] } expressions: var_name ('=' expression)(?) { $return = $item[1] } expression: conditional_operation | arithmetic_operation | equality | function_call | object_declaration | numeric_value | array_reference | array_value | object_reference | escapedRegex | escapedQuote | var_name operand: var_name | numeric_value arithmetic_operation: operand arithmetic_operator '(' arithmetic_operation ')' | operand arithmetic_operator arithmetic_operation | '(' operand arithmetic_operator operand ')' | operand arithmetic_operator operand | unary_negation_operator operand # -12 | incremental_operator operand # --j | operand incremental_operator # i++ conditional_operation: equality '?' expression ':' expression | '(' equality '?' expression ':' expression ')' comma_values: | array_reference: array_name '(' expression ')' | array_name '()' array_value: array_name '[' array_item ']' ('.' expression)(?) | '[' array_list ']' array_list: array_item: var_name | integer object_reference: object_declaration: 'new' object_name '()' | 'new' object_name '(' comma_values ')' | 'new' object_name object_name: 'Array' | 'Object' | 'Date' | /\w+/ function_call: function_name '()' | function_name '(' comma_values ')' function_name: /\w+/ condition: 'true' | '1' | 'false' | '0' | equality equality: '(' expression ')' | '(' expression equality_operator expression ')' var_name: /\w+/ array_name: /\w+/ numeric_value: real_number | integer integer: /\d+/ real_number: /\d+\.?\d*/ escapedRegex: '__REGEX__' escapedQuote: '__QUOTE__' # ARITHMETIC OPERATORS arithmetic_operator: '+' | '-' | '*' | '/' | '%' incremental_operator: '++' | '--' unary_negation_operator: '-' # OTHER OPERATORS string_operator: '+' | '+=' logical_operator: '&&' | '||' | '!' bitwise_operator: '&' | '^' | '|' | '~' | '<<' | '>>' | '>>>' equality_operator: '===' | '!==' | '==' | '!=' | '>' | '<' | '>=' | '<=' assignment_operator: '+' | '-' | '*' | '/' | '%' | '<<' | '>>' | '>>>' | '&' | '^' | '|' assignshort_operator: '+=' | '-=' | '*=' | '/=' | '%=' | '<<=' | '>>=' | '>>>=' | '&=' | '^=' | '|=' }; $parser = new Parse::RecDescent ($grammar) or die "*** Bad grammar!\n"; foreach my $localDeclaredVar (@localDeclaredVars) { my $refParsedValues = $parser->statement($localDeclaredVar) || print "*** $localDeclaredVar\n"; if (ref($refParsedValues) eq 'ARRAY') { foreach my $parsedValue (@$refParsedValues) { push (@localVariables, $parsedValue) if ($parsedValue); #print "==> [$parsedValue]\n"; } } else { push (@localVariables, $refParsedValues) if ($refParsedValues); #print "==> [$refParsedValues]\n"; } } #### expression: '(' expression ')' | conditional_operation | arithmetic_operation | equality | function_call | object_declaration | numeric_value | array_reference | array_value | object_reference | escapedRegex | escapedQuote | var_name #### var myTest1 = 1; var myTest2 = 2, myTest3 = 3, myTest4; var myTest5 = new Array(__QUOTE__,__QUOTE__), myTest6; var myTest7 =__REGEX__; var myTest8 = myTest5.x; var myTest9 = myTest[0], myTest10 = myTest[0]; var myTest11 = (myTest1 == myTest2); var myTest12 = (myTest1 == myTest2), myTest13 = 2; var myTest14 = (myTest1 == myTest2), myTest15; var myTest16 = new Array(1, 2); var myTest17, myTest18; var myTest19 = __QUOTE__+ strText +__QUOTE__; var myTest20 = getDateFromFormat(val,format); var myTest21 = new Object(); var myTest22 = getDateFromFormat(date2,dateformat2); var myTest23 = str.substring(i,i+x); var myTest24 = new Date(year,month-1,date,hh,mm,ss); var myTest25 = [__QUOTE__,__QUOTE__,__QUOTE__,__QUOTE__,__QUOTE__]; var myTest26 = [1, 2, 3, 4, 5]; var myTest27 = 4 + 5; var myTest28 = j++; var myTest29 = ++i; var myTest30 = -4; var myTest31 = 12 + (40 / 5); var myTest32 = 12 + 13; var myTest33 = 12 + 13 + 14; var myTest34 = (100 * 20); var myTest35 = document.all(__QUOTE__); var myTest36 = document.all(__QUOTE__).value; var myTest37 = document.all(__QUOTE__).value.toString(); var myTest38 = (myTest34); var myTest39 = (myTest34) ? 1 : 2; var myTest40 = a + ((b) ? 1 : 2); var myTest41 = arySubCookies[j].match(__REGEX__); var myTest42 = date.getYear() + __QUOTE__; var myTest43 = date.getMonth() + 1; var myTest44 = now.getMonth()+1; #### *** var myTest40 = a + ((b) ? 1 : 2); *** var myTest42 = date.getYear() + __QUOTE__; *** var myTest43 = date.getMonth() + 1; *** var myTest44 = now.getMonth()+1;