Tip: Click lines to highlight, hold ctrl/cmd to multi-select

http://codedumper.com/edeve (30-Apr @ 05:09)

mrgenixus

Syntax Highlighted Code

  1. <?php
  2. $STATES = array("WAIT","SCOPE","CRITERIA","ITEM","QUOTE");
  3. function debug_this($value)
  4. {
  5.     echo $value;
  6. }
  7. function is_escaped($escape_index,$current_index)
  8. {
  9.     return ($escape_index != -1 && $escape_index == ($current_index - 1));
  10. }
  11. function add_and_reset_scope(&$context, &$scope,&$criteria = array())
  12. {
  13.     if (isset($context[$scope]) && is_array($context[$scope])) $criteria = array_merge($criteria,$context[$scope]);
  14.     $context[$scope] = $criteria;
  15.     $criteria = array();
  16.     $scope = "";
  17. }
  18. function add_new_criteria(&$criteria,$initial_character)
  19. {
  20.     $criteria[] = $initial_character;
  21.     debug_this( "\10\tNEW CRITERIA BEGINS: " . $criteria[count($criteria) - 1] . "\n");
  22. }
  23. function add_to_current_criteria(&$criteria,$value){
  24.     $last = count($criteria) - 1;
  25.     $criteria[$last] .= $value;
  26.     debug_this("\10\tCURRENT: " . $criteria[$last] . "\n");
  27. }
  28. function setState(&$state,$newState,$line = -1) {
  29.     global $STATES; $out = "[$line]: STATE ";
  30.     if(isset($state)) if (isset($STATES[($index = log($state,2))])) $out .= $STATES[$index]. "($state)";
  31.         else $out .=  "\"$state\"";
  32.     else $out .= "NULL";
  33.     $out .= ", CHANGING TO " . $STATES[log($newState,2)] . "($newState)\n";
  34.     debug_this($out);
  35.     $state = $newState;
  36. }
  37. function BBranch($branch,$state,$value,$line = -1)
  38. {
  39.     global $STATES;
  40.     debug_this("[$line] BRANCH {$branch} [" . $STATES[log($state,2)] . "]: $value \n" );
  41. }
  42.  
  43. function parse($str,$default_scope = 'group'){
  44.     //states
  45.     global $STATES;
  46.    
  47.     foreach ($STATES as $INDEX => $STATENAME) {
  48.         $$STATENAME = pow(2,$INDEX);
  49.         debug_this($STATENAME . " = " . $$STATENAME . "\n");
  50.     }
  51.     debug_this("\$WAIT = $WAIT\n");
  52.     $ERRORS = array();
  53.     $escape = -1;
  54.     $context = array();
  55.     $criteria = array();
  56.     $quote = $item = $scope = "";
  57.     setState($state,($pre_quote_state = $WAIT),__LINE__);
  58.     $str .= " ";
  59.     foreach (str_split($str) as $index => $value)
  60.     {
  61.         if ($state > $QUOTE) setState($state,$WAIT,__LINE__);
  62.         if(preg_match("/\s/",$value)){
  63.         BBranch('WHITESPACE',$state,$value,__LINE__);
  64.             if($state == $ITEM)
  65.             {
  66.                 if (is_escaped($escape,$index)) $item .= $value;
  67.                 else {
  68.                     add_to_current_criteria($criteria,"",__LINE__);
  69.                     if(count($scope)) add_and_reset_scope($context,$scope,$criteria);                        
  70.                     setState($state,$WAIT,__LINE__);
  71.                 }
  72.             }
  73.             elseif($state == $QUOTE)
  74.             {
  75.                 add_to_current_criteria($criteria,$value);
  76.             }
  77.             elseif($state == $SCOPE)
  78.             {
  79.                 if($default_scope != ""){
  80.                     add_new_criteria($criteria,$scope);
  81.                     add_and_reset_scope($context,$default_scope,$criteria);
  82.                     setState($state,$WAIT,__LINE__);
  83.                 }
  84.                 else add_and_reset_scope($context,$scope);
  85.                 setState($state,$WAIT,__LINE__);
  86.             }
  87.         }
  88.         elseif(preg_match("/[\:\=]/",$value)) {
  89.             BBranch('EQUIV',$state,$value,__LINE__);
  90.             if($state == $SCOPE && strlen($scope)) {
  91.                 //add_and_reset_scope($context,$scope);
  92.                 setState($state,$CRITERIA,__LINE__);
  93.             }
  94.             elseif($state & ( $ITEM | $QUOTE )) add_to_current_criteria($criteria,$value);
  95.         }
  96.         elseif(strstr("\\",$value)){
  97.             BBranch('ESCAPE',$state,$value,__LINE__);
  98.             if (! is_escaped($escape,$index)) $escape = $index;
  99.             else {
  100.                 if($state & ( $ITEM | $QUOTE )) {
  101.                     add_to_current_criteria($criteria,$value);
  102.                 }
  103.                 if($state & $CRITERIA)
  104.                 {
  105.                     add_new_criteria($criteria,$value);
  106.                     setState($state,$ITEM);
  107.                 }
  108.             }
  109.         }
  110.         elseif(strstr(",",$value)){
  111.             BBranch('COMMA',$state,$value,__LINE__);
  112.             if($state == $ITEM)
  113.             {
  114.                 setState($state,$CRITERIA,__LINE__);
  115.             }
  116.             elseif($state == $SCOPE)
  117.             {
  118.                 add_new_criteria($criteria,$scope);
  119.                 if($default_scope != ""){
  120.                     $scope = $default_scope;
  121.                     setState($state,$CRITERIA,__LINE__);
  122.                 }
  123.                 else {
  124.                     add_and_reset_scope($context,$scope = null,$criteria);
  125.                     $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED <INDEX: $Index>";
  126.                     setState($state,$WAIT,__LINE__);
  127.                 }
  128.             }
  129.             elseif($state & ( $CRITERIA | $WAIT)) $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED <INDEX: $Index>";
  130.            
  131.         }
  132.         elseif(preg_match("/[\"']/",$value)){
  133.             BBranch('QUOTE',$state,$value,__LINE__);
  134.            
  135.             if($state == $QUOTE){
  136.                 debug_this("IS QUOTE ESCAPED: " . ((is_escaped($escape,$index)) ? "YES" : "NO") . "\n");
  137.                 if ($value == $quote && !is_escaped($escape,$index))
  138.                 {
  139.                    
  140.                     setState($state,$pre_quote_state,__LINE__);
  141.                     $quote = "";
  142.                 }
  143.                 elseif($pre_quote_state & ( $CRITERIA | $ITEM))
  144.                 {
  145.                     add_to_current_criteria($criteria,$value);
  146.                 }
  147.                 elseif($pre_quote_state & ( $WAIT | $SCOPE ))
  148.                 {
  149.                     $scope .= $value;
  150.                 }
  151.             }
  152.             elseif($state & ( $WAIT | $CRITERIA ))
  153.             {
  154.                 $pre_quote_state = $state;
  155.                 $quote = $value;
  156.                 setState($state,$QUOTE,__LINE__);
  157.             }
  158.         }
  159.         else {
  160.             BBranch('WORD',$state,$value,__LINE__);
  161.             if($state == $WAIT) {
  162.                
  163.                 setState($state,$SCOPE,__LINE__);
  164.                 $scope = $value;
  165.             }
  166.             elseif($state == $SCOPE) $scope .= $value;
  167.             elseif ($state == $CRITERIA)
  168.             {
  169.                 setState($state,$ITEM,__LINE__);
  170.                 add_new_criteria($criteria,$value);
  171.             }
  172.             elseif ($state == $ITEM) add_to_current_criteria($criteria,$value);
  173.             elseif($state == $QUOTE){
  174.                
  175.                 if($pre_quote_state == $WAIT){
  176.                    
  177.                     $pre_quote_state = $SCOPE;
  178.                     $scope = $value;
  179.                 }
  180.                 elseif($pre_quote_state == $CRITERIA) {
  181.                    
  182.                     $pre_quote_state = $ITEM;
  183.                     add_new_criteria($criteria,$value);
  184.                 }
  185.                 else
  186.                 {
  187.                     add_to_current_criteria($criteria,$value);
  188.                 }
  189.             }
  190.                
  191.         }
  192.     }
  193.     return $context;
  194. }
  195. function interpret($arr){
  196.     $str = "";
  197.     $str = print_r($arr,true);
  198.     return $str;
  199. }
  200.  
  201. $strs = array(
  202.     "file:hello.fa start:0 end:1322251",
  203.     "file:hello.fa group:\"wild dogs\"",
  204.     "file:hello.fa group:\"12 angry men\" group:\"11 'angry' men\"",
  205.     "file:hello.fa group:\"12 angry men\",\"11 \\\"angry\\\" men\""
  206.  
  207. );
  208. foreach ($strs as $search){
  209.     echo $search . ":\n " . str_replace("\n", "\n\t", interpret(parse($search))). "\n";
  210. }
  211.  

Plain Code

<?php
$STATES = array("WAIT","SCOPE","CRITERIA","ITEM","QUOTE");
function debug_this($value)
{
    echo $value;
}
function is_escaped($escape_index,$current_index)
{
    return ($escape_index != -1 && $escape_index == ($current_index - 1));
}
function add_and_reset_scope(&$context, &$scope,&$criteria = array())
{
    if (isset($context[$scope]) && is_array($context[$scope])) $criteria = array_merge($criteria,$context[$scope]);
    $context[$scope] = $criteria;
    $criteria = array();
    $scope = "";
}
function add_new_criteria(&$criteria,$initial_character)
{
    $criteria[] = $initial_character;
    debug_this( "\10\tNEW CRITERIA BEGINS: " . $criteria[count($criteria) - 1] . "\n");
}
function add_to_current_criteria(&$criteria,$value){
    $last = count($criteria) - 1;
    $criteria[$last] .= $value;
    debug_this("\10\tCURRENT: " . $criteria[$last] . "\n");
}
function setState(&$state,$newState,$line = -1) {
    global $STATES; $out = "[$line]: STATE ";
    if(isset($state)) if (isset($STATES[($index = log($state,2))])) $out .= $STATES[$index]. "($state)";
        else $out .=  "\"$state\"";
    else $out .= "NULL";
    $out .= ", CHANGING TO " . $STATES[log($newState,2)] . "($newState)\n";
    debug_this($out);
    $state = $newState;
}
function BBranch($branch,$state,$value,$line = -1)
{
    global $STATES;
    debug_this("[$line] BRANCH {$branch} [" . $STATES[log($state,2)] . "]: $value \n" ); 
}

function parse($str,$default_scope = 'group'){
    //states
    global $STATES;
    
    foreach ($STATES as $INDEX => $STATENAME) { 
        $$STATENAME = pow(2,$INDEX); 
        debug_this($STATENAME . " = " . $$STATENAME . "\n");
    }
    debug_this("\$WAIT = $WAIT\n");
    $ERRORS = array();
    $escape = -1;
    $context = array();
    $criteria = array();
    $quote = $item = $scope = "";
    setState($state,($pre_quote_state = $WAIT),__LINE__);
    $str .= " ";
    foreach (str_split($str) as $index => $value)
    {
        if ($state > $QUOTE) setState($state,$WAIT,__LINE__);
        if(preg_match("/\s/",$value)){
        BBranch('WHITESPACE',$state,$value,__LINE__);
            if($state == $ITEM)
            {
                if (is_escaped($escape,$index)) $item .= $value;
                else {
                    add_to_current_criteria($criteria,"",__LINE__);
                    if(count($scope)) add_and_reset_scope($context,$scope,$criteria);                        
                    setState($state,$WAIT,__LINE__);
                }
            }
            elseif($state == $QUOTE)
            {
                add_to_current_criteria($criteria,$value);
            }
            elseif($state == $SCOPE)
            {
                if($default_scope != ""){
                    add_new_criteria($criteria,$scope);
                    add_and_reset_scope($context,$default_scope,$criteria);
                    setState($state,$WAIT,__LINE__);
                }
                else add_and_reset_scope($context,$scope);
                setState($state,$WAIT,__LINE__);
            }
        }
        elseif(preg_match("/[\:\=]/",$value)) {
            BBranch('EQUIV',$state,$value,__LINE__);
            if($state == $SCOPE && strlen($scope)) {
                //add_and_reset_scope($context,$scope);
                setState($state,$CRITERIA,__LINE__);
            }
            elseif($state & ( $ITEM | $QUOTE )) add_to_current_criteria($criteria,$value);
        }
        elseif(strstr("\\",$value)){
            BBranch('ESCAPE',$state,$value,__LINE__);
            if (! is_escaped($escape,$index)) $escape = $index;
            else {
                if($state & ( $ITEM | $QUOTE )) {
                    add_to_current_criteria($criteria,$value);
                }
                if($state & $CRITERIA)
                {
                    add_new_criteria($criteria,$value);
                    setState($state,$ITEM);
                }
            }
        }
        elseif(strstr(",",$value)){
            BBranch('COMMA',$state,$value,__LINE__); 
            if($state == $ITEM)
            {
                setState($state,$CRITERIA,__LINE__);
            }
            elseif($state == $SCOPE)
            {
                add_new_criteria($criteria,$scope);
                if($default_scope != ""){
                    $scope = $default_scope;
                    setState($state,$CRITERIA,__LINE__);
                }
                else {
                    add_and_reset_scope($context,$scope = null,$criteria);
                    $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED <INDEX: $Index>";
                    setState($state,$WAIT,__LINE__);
                }
            }
            elseif($state & ( $CRITERIA | $WAIT)) $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED <INDEX: $Index>";
            
        }
        elseif(preg_match("/[\"']/",$value)){
            BBranch('QUOTE',$state,$value,__LINE__);
            
            if($state == $QUOTE){
                debug_this("IS QUOTE ESCAPED: " . ((is_escaped($escape,$index)) ? "YES" : "NO") . "\n");
                if ($value == $quote && !is_escaped($escape,$index))
                {
                    
                    setState($state,$pre_quote_state,__LINE__);
                    $quote = "";
                }
                elseif($pre_quote_state & ( $CRITERIA | $ITEM))
                {
                    add_to_current_criteria($criteria,$value);
                }
                elseif($pre_quote_state & ( $WAIT | $SCOPE ))
                {
                    $scope .= $value;
                }
            }
            elseif($state & ( $WAIT | $CRITERIA ))
            {
                $pre_quote_state = $state;
                $quote = $value;
                setState($state,$QUOTE,__LINE__);
            }
        }
        else {
            BBranch('WORD',$state,$value,__LINE__);
            if($state == $WAIT) {
                
                setState($state,$SCOPE,__LINE__);
                $scope = $value;
            }
            elseif($state == $SCOPE) $scope .= $value;
            elseif ($state == $CRITERIA)
            {
                setState($state,$ITEM,__LINE__);
                add_new_criteria($criteria,$value);
            }
            elseif ($state == $ITEM) add_to_current_criteria($criteria,$value);
            elseif($state == $QUOTE){
                
                if($pre_quote_state == $WAIT){
                    
                    $pre_quote_state = $SCOPE;
                    $scope = $value;
                }
                elseif($pre_quote_state == $CRITERIA) {
                    
                    $pre_quote_state = $ITEM;
                    add_new_criteria($criteria,$value);
                }
                else
                {
                    add_to_current_criteria($criteria,$value);
                }
            }
                
        }
    }
    return $context;
}
function interpret($arr){
    $str = "";
    $str = print_r($arr,true);
    return $str;
}

$strs = array(
    "file:hello.fa start:0 end:1322251",
    "file:hello.fa group:\"wild dogs\"",
    "file:hello.fa group:\"12 angry men\" group:\"11 'angry' men\"",
    "file:hello.fa group:\"12 angry men\",\"11 \\\"angry\\\" men\""

);
foreach ($strs as $search){
    echo $search . ":\n " . str_replace("\n", "\n\t", interpret(parse($search))). "\n";
}

Permalink: http://codedumper.com/edeve