PHP lexikální a syntaktický analyzátor
\n"; } } set_error_handler("obsluha_chyb"); */ $keywords=file_get_contents('keyWords.txt'); $reswords=file_get_contents('resWords.txt'); $input = $_REQUEST['input']; if(empty($input)) $input=file_get_contents("input.php"); if(isset($_REQUEST['odeslat'])) { /* Zde probehne lexikalni analyza */ $lex_ok=false; /* Výsledek lexikální analýzy, true pokud bez chyb */ $lex_pole=array(); /* Pole vysledku lexikalni analyzy */ $lex_pocitadlo=0; /* Vynuluj index tohoto pole */ $lex_radek=1; /* Nastav radkovani od prvniho radku */ $vstupni_data=$input; /* Manipulujeme s kopii vstupnich dat */ $konec=false; /* Globalni promenna urcujici konec analyzy */ /* Vysekne prvni symbol z globalni promenne vstupni_data a vrati jej */ function CtiSymbol() { global $vstupni_data; global $first; if(!JeKonec() && empty($vstupni_data)) Skonci(); /* Konec vstupniho souboru, zavola Skonci() a ta nastavi globalni promennou */ else { $first=substr($vstupni_data,0,1); $vstupni_data=substr($vstupni_data,1); } } /* Hleda dopredu symbol, ktery je v promenne co_hledat. Vraci true, pokud ho najde, jinak false. Pokud symbol na dalsi pozici najde, vysekne jej a nacpe ho do globalni promenne first. Promennou cyklit nastavujeme, zda ma pri nalezeni symbol vyseknout a zkusit, zda neni jeste i na dalsi pozici. */ function CtiDopredu($co_hledat,$cyklit) { global $vstupni_data; $next=substr($vstupni_data,0,1); if($next==$co_hledat) { if($cyklit) { while($next==$co_hledat) { $vstupni_data=substr($vstupni_data,1); $next=substr($vstupni_data,0,1); } } else { $vstupni_data=substr($vstupni_data,1); } return true; } else return false; } /* Volana s hlaskou a cislem radku, do vystupniho pole errors pridava chybove hlaseni */ function Chyba($hlaska, $radek) { global $errors; $errors.='('.$radek.') '.$hlaska.'
'; } function Varovani($hlaska, $radek) { global $warnings; $warnings.='('.$radek.') '.$hlaska.'
'; } /* Zaregistrovali jsme novy radek podle end_of_line charakteru */ function DalsiRadek() { global $lex_radek; $lex_radek++; } /* Kontroluje, zda je predany text klicovym slovem jazyka PHP */ function JeBool($testSlova) { if(strtoupper($testSlova)=='FALSE' || strtoupper($testSlova)=='TRUE' || strtoupper($testSlova)=='NULL') return true; else return false; } function JeKey($testSlova,$res_key) { global $keywords; global $reswords; /* Pokud true - hledej KEYwords, pokud false - hledej RESERVEDwords */ if($res_key) $fileinput=$keywords; elseif(!$res_key) $fileinput=$reswords; else return false; $delka=strlen($testSlova); $test = strpos($fileinput, strtoupper($testSlova)); $ping= substr($fileinput, ($test-1), $test); $fileinput = substr($fileinput, ($test+$delka)); while (!empty ($test)){ $enter= substr($fileinput, 0, 1); if ($test==true) { if ((ord($enter)==13 || ord($enter)==10)&& (ord($ping)==13 || ord($ping)==10)) return true; } $test = strpos($fileinput, strtoupper($testSlova)); $ping= substr($fileinput, ($test-1), $test); $fileinput = substr($fileinput, ($test+$delka)); } return false; } /* Pusti na promennou first regularni vyraz a testuje, zda je pismeno (nebo _) a vraci true/false */ function JePismeno() { global $first; $reg = "^[a-zA-ZáčďéěíňóřšťůúýžÁČĎÉĚÍŇÓŘŠŤŮÚÝŽ_]{0,1}$"; if(ereg($reg, $first) && !JeKonec()) return true; else return false; } /* Zjistuje zda je promenna first cislice, vraci true/false */ function JeCislo() { global $first; if(is_numeric($first) && !JeKonec()) return true; else return false; } /* Konec prace lexikalniho analyzatoru, protoze na vstupu nejsou zadna dalsi data */ function Skonci() { global $konec; $konec=true; Pridej('T_EOF',null); } /* Zjistuje, zda jsou jeste nejaka data na vstupu, nebo je prace lexikalniho analyzatoru skoncena */ function JeKonec() { global $konec; if($konec) return true; else return false; } /* Zjistuje, zda jsme na konci radky (Carriage Return nebo New Line) */ function JeEOL() { global $first; if(ord($first)==10 || ord($first)==13) return true; else return false; } function JeTAB() { global $first; if(ord($first)==9) return true; else return false; } /* Do pole vysledku lexikalni analyzy uklada dvojici token a hodnota */ function Pridej($token,$hodnota) { global $lex_pole; global $lex_pocitadlo; global $lex_radek; $lex_pole[$lex_pocitadlo]['token']=$token; $lex_pole[$lex_pocitadlo]['hodnota']=$hodnota; $lex_pole[$lex_pocitadlo]['radek']=$lex_radek; $lex_pocitadlo++; } /* Casti kodu, ktere nejsou uzavrene mezi oteviracim a zaviracim tagem ulozme do obsahu tokenu T_NOT_PHP */ function TokenizujNePHP() { global $vstupni_data; $oteviraci=strpos($vstupni_data,''); $not_php=substr($vstupni_data,0,strpos($vstupni_data,'')); $trimmed=trim($not_php); if(!empty($trimmed)) { Pridej('T_NOT_PHP',nl2br(htmlspecialchars($not_php))); $vstupni_data=substr($vstupni_data,strpos($vstupni_data,'')); for($i=0;$i
',false)) {Pridej('T_SIPKA','->'); break;} elseif (CtiDopredu('=',false)) {Pridej('T_MINUS_ROVNO','-='); break;} elseif (CtiDopredu('-',false)) { if (CtiDopredu('-',true)) {Pridej('T_TEXT',null); break;} else {Pridej('T_DOUBLE_MINUS','--'); break;} } else {Pridej('T_MINUS','-'); break;} case '~': if (CtiDopredu('=',false)) {Pridej('T_TILDE_ROVNO','~='); break;} else {Pridej('T_TILDE','~'); break;} case '<': if (CtiDopredu('?',false)) { if(CtiDopredu('p',false)) { if(CtiDopredu('h',false)) { if(CtiDopredu('p',false)) { if((strpos($vstupni_data,'?>')===false)) Varovani('Neuzavreny PHP tag!',$lex_radek); elseif((strpos($vstupni_data,'')) && (strpos($vstupni_data,'')
'))) Varovani('Neuzavreny PHP tag!',$lex_radek); Pridej('T_OPEN_TAG','')===false)) Varovani('Neuzavreny PHP tag!',$lex_radek); elseif((strpos($vstupni_data,'')) && (strpos($vstupni_data,'')
'))) Varovani('Neuzavreny PHP tag!',$lex_radek); Pridej('T_OPEN_TAG',''); break;} elseif (CtiDopredu('=',false)) {Pridej('T_MENSI_ROVNO','<='); break;} elseif (CtiDopredu('<',false)) { if (CtiDopredu('=',false)) {Pridej('T_LEFT_SHIFT_ROVNO','<<='); break;} else {Pridej('T_LEFT_SHIFT','<<'); break;} } else {Pridej('T_MENSI','<'); break;} case '>': if (CtiDopredu('=',false)) {Pridej('T_VETSI_ROVNO','>='); break;} elseif (CtiDopredu('>',false)) { if (CtiDopredu('=',false)) {Pridej('T_RIGHT_SHIFT_ROVNO','>>='); break;} else {Pridej('T_RIGHT_SHIFT','>>'); break;} } else {Pridej('T_VETSI','>'); break;} case '?': if (CtiDopredu('>',false)) {Pridej('T_CLOSE_TAG','?>'); TokenizujNePHP(); break;} else {Pridej('T_QUESTION','?'); break;} case '=': if (CtiDopredu('=',false)) { if (CtiDopredu('=',false)) {Pridej('T_THREE_EQUAL','==='); break;} else {Pridej('T_TWO_EQUAL','=='); break;} } else {Pridej('T_EQUAL','='); break;} case '!': if (CtiDopredu('=',false)) { if (CtiDopredu('=',false)) {Pridej('T_DOUBLE_NEROVNO','!=='); break;} else {Pridej('T_NEROVNO','=='); break;} } else {Pridej('T_EXCLAMATION','!'); break;} case '+': if (CtiDopredu('=',false)) {Pridej('T_PLUS_ROVNO','+='); break;} elseif (CtiDopredu('+',false)) {Pridej('T_DOUBLE_PLUS','++'); break;} else {Pridej('T_PLUS','+'); break;} case '*': if (CtiDopredu('/',false)) {Pridej('T_KOMENTAR_END','*/'); break;} elseif (CtiDopredu('=',false)) {Pridej('T_KRAT_ROVNO','*='); break;} else {Pridej('T_KRAT','*'); break;} case '.': if (CtiDopredu('=',false)) {Pridej('T_TECKA_ROVNO','.='); break;} else {Pridej('T_TECKA','.'); break;} case '%': if (CtiDopredu('=',false)) {Pridej('T_MODULO_ROVNO','%='); break;} else {Pridej('T_MODULO','%'); break;} case '&': if (CtiDopredu('&',false)) {Pridej('T_DOUBLE_AND','&&'); break;} elseif (CtiDopredu('=',false)) {Pridej('T_AND_ROVNO','&='); break;} else {Pridej('T_AND','&'); break;} case '|': if (CtiDopredu('=',false)) {Pridej('T_OR_ROVNO','|='); break;} elseif (CtiDopredu('|',false)) {Pridej('T_DOUBLE_OR','||'); break;} else {Pridej('T_SINGLE_OR','|'); break;} case '^': if (CtiDopredu('=',false)) {Pridej('T_XOR_ROVNO','^='); break;} else {Pridej('T_XOR','^'); break;} default: Pridej('T_ANY',$first); } CtiSymbol(); /* A nakonec si precti dalsi symbol */ } } if(empty($errors)) { $lex_ok=true; Chyba('
Lexikální analýza proběhla bez chyb, celkem vygenerovala '.sizeof($lex_pole).' tokenů.
',$lex_radek); } else {Chyba('Lexikální analýza odhalila chyby, syntaktická analýza proto nebyla provedena.',$lex_radek);} require "perform_syn.php"; } ?>
">
Řádek
Token
Hodnota
Odsazení:
3
6
9
Jen PHP:
Najdi »