• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
شبه کامپایلر
#1
سلام دوستان در قسمت دیگر موارد گفتم که یه ide خوب معرفی کنید که نکردید . اکثر آنها را نصب کردم به غیر از pdt eclipse و نشد برنامه رو درست و حسابی trace کنم
کد زیر پرانتز گذاری عبارت رو چک می کنه . به نظر خودم درسته ولی تو stack نمیره انگار چون پیغام های اونجا رو چاپ نمی کنه . register global رو هم on کردم واسه متغیر سراسری .
احساس خوبی ندارم راجع به حلقه for انگار استک رو فراخوانی نمی کنه
به نظر شما بی خیال این شم که این برنامه رو با php بنویسم .
بد بختی اینه که error هم نمی ده .
کد:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
    <meta http-equiv="content-type" content="text/html; charset=windows-1256" />
    <meta name="author" content="7A1433" />

    <title>Untitled 2</title>
</head>

<body>

<table align="center">
<form method="post" action="index.php">

   <tr>
      <td><textarea cols="10" rows="10" name="txt_code"></textarea></td>
   </tr>
  
   <tr>
     <td><input type="submit" value="ارسال" /></td>
   </tr>

</form>
</table>


<?php
//--------------------- تعريف متغير ها و تواب -------------
$stack[50]="";
$top=-1;

//----------------------  قسمت اجرايي برنامه
if(!empty($_POST['txt_code']))
{
$text=$_POST['txt_code'];

parantez_checking($text);

}

//---------------------------------------------------------
function push($harf)
{
  if($top<49)
  {
    $top=$top+1;
    $stack[$top]=$harf;
    echo("-----------");
    echo($stack[$top]);
  }
  else
  {
    $error=" stack is full";
    echo($error);
    die();
  }
}

//----------------------------------------------------------
function   pop()
{
  $tmp;
  if($top>-1)
  {
    $tmp=$stack[$top];
    $stack[$top]="";
    $top=$top-1;
    return($tmp);
  }
  else
  {
    $error="under flow";
    echo($error);

  }
}

//--------------------------------------------------
function parantez_checking($text)
{
  $len=strlen($text);

  for($i=1;$i<=$len;$i++)
  {
    $harf=$harf[$i];

    if(($harf=="{") || ($harf=="[") || ($harf== "("))
    {
       push($harf);
    }
    else
     {
     if((($harf==")") && ($p=pop()!="(")) || (($harf=="]") && ($p=pop()!="[")) || (($harf=="}") && ($p=pop()!="{")))
      {
        $error=" ناسازگاري در پرانتز يا آکولاد";
        echo($error);
        die();
      }
     }
  }

if ($top!=-1)
  {
    // پشته خالي نيست
        echo($top);
        $error=" شو شولات";
        echo($error);


  }
}






?>

</body>
</html>
  پاسخ
تشکر شده توسط :
#2
دوست عزیز hfsa ( عجب اسم کاربری! )
از قالب کد استفاده کنید پست تون بسیار خوانا تر خواهد شد

و بگید که این کد قراره چی کار کنه!!!
  پاسخ
تشکر شده توسط :
#3
hfsa جان ، لطفاً پیش از ارسال تاپیک قوانین انجمن ، چه اینجا و چه هرجای دیگه ، مطالعه کنید.
درضمن ، نبایدم حلقه ات درست کار کنه. چون تو اومدی طول رشته رو پیدا کردی و دادی به حلقه تا به همون اندازه ادامه پیدا کنه در ادامه عدد حلقه رو میدی داخل آرایه و بررسی می کنه اگر برابر ( بود اینکارو کن اگرم برابر ) بود اینکارو کن. در صورتی که هیچکدوم صحیح نیست. بجای کلی حلقه و اینا میتونی مثل زیر بنویسی:
کد پی‌اچ‌پی:
$str 'salam ali ( khoobi ) khdfdfdf }';

if( 
strpos$str')' ) ) {
    echo( 
'dare' );
}
else {
    echo( 
'nadare' );

غایب
  پاسخ
تشکر شده توسط : molana hfsa
#4
کد پی‌اچ‌پی:
for($i=1;$i<=$len;$i++) 
اولا که برای حلقه باید از صفر شروع کنی ! ( حرف اول با ایندکس صفر )
کد پی‌اچ‌پی:
for($i=0;$i<=$len-1;$i++) 

اینجا دقیقا چه خبره !!!!!!!!!؟
کد پی‌اچ‌پی:
$harf=$harf[$i]; 
اینجا باید بشه :
کد پی‌اچ‌پی:
$harf=$text[$i]; 

-----------------------------------------------------
حالا کلا برای این برنامه که نیاز به شبیه سازی استک نیست حتما ! ( حدس میزنم کار دانشگاهی باشه )
فقط با همین تابع کارت راه میفته :
کد پی‌اچ‌پی:
function parantez_checking($text)
{
    
$counter=0;
    
$len=strlen($text);
    for(
$i=0;$i<=$len-1;$i++){
        
$harf=$text[$i];
        if((
$harf=="{") || ($harf=="[") || ($harf== "("))
            
$counter++;
        elseif((
$harf==")") || ($harf=="]") || ($harf=="}"))
            
$counter--;
    }
    if(
$counter==0)
        echo(
'True');
    else
        echo(
'False');    


که البته یه ذره کار داره که چیز خاصی نیست و میتونی کاملش کنی ...
  پاسخ
تشکر شده توسط : cyletech hfsa
#5
تشکر از اصلاح پست . با موبایل مطلب رو نوشته بودم
دو جا اشتباه کردم یکی تو حلقه for ویکی در جاگذاری مقدار $harf اصلاح شد . ولی پرانتز باز و بسته رو می دم underflow می ده . ؟؟؟؟؟؟؟؟؟؟؟؟؟
وقتی هیچ علامتی وارد نمی کنم مقدار top مخالف منفی یک است و وارد شرط می شه و پیغام چرت و پرت رو چاپ می کنه ولی مقدار top رو چاپ نمی کنه ؟؟؟؟؟؟؟؟؟؟؟؟؟
اما در مورد ساده کردن کد که با کانتر نوشته شده با {) در حالی که جواب غلطه ولی درست فرض می شود .
راستی این قسمت رو نفهمیدم
نقل قول:کنه در ادامه عدد حلقه رو میدی داخل آرایه و بررسی می کنه اگر برابر ( بود اینکارو کن اگرم برابر ) بود اینکارو کن. در صورتی که

اون حلقه رو این طورش کردم که else رو کردمش else if
این قدر سرعتم پایینه که نمی تونم اصلاح کنم . اون قضیه که گفتی ن else اجرا می شه . خوب تو else با if دوباره چک می شه . یه چیز دیگه این top رو هر جا می گذارم توی تابع ها که مقدارش رو چاپ کنن نمی کنن. رجیستر گلوبالم آن هست .
  پاسخ
تشکر شده توسط :
#6
نقل قول:راستی این قسمت رو نفهمیدم
اشتباه از من بود. من یه چیزی رو نمیدونستم و Bojbaj بهم یاد داد. مرسی
این همه دردسر واسه اینکه ببینی پرانتز داره یا نه Big Grin خب از همون کد من استفاده کنید دیگه. سرعت بالا و پاسخگو!
غایب
  پاسخ
تشکر شده توسط : Bojbaj
#7
آخه کد شما در اینجا واسه پرانتز است . تو اون تکه کد پرانتز ، آکولاد و کروشه هم منظور شده و این قضیه درست کار نمی کنه که بگیم مثلا پرانتز بسته اومد فلان کار را بکن . چون همان طور که گفتم ممکنه (} یک کد اشتباه مثل حالت خط بالا رو داشته باشیم که ا گه از استک استفاده نکنیم درست در نمیاد .
راستی من با سی پلاس این تکه کد را امتحان کردم و کار کرد نمی دونم اینجا تو php یه قضیه ای سر این متغیر هایی که باید گلوبال باشد میاد که من نمی دونم Huh
راستی این تازه اولین مرحله هستش که من توش موندم . مرحله بعدی تشخیص اینه که کاربر ; هارو گذاشته یا نه
  پاسخ
تشکر شده توسط :
#8
کد پی‌اچ‌پی:
$str 'salam ali ( khoobi ) khdfdfdf }';

if( (
strpos$str')' ) ) || (strpos$str'}' ) ) || (strpos$str']' ) ) ) {
    echo( 
'dare be samte chap' );
}
elseif( (
strpos$str'(' ) ) || (strpos$str'{' ) ) || (strpos$str'[' ) ) ) {
    echo( 
'dare be samte rast' );

حالا اگر همه آکولاد و پرانتز و کروشه رو داشت اینکارو می کنه اگر برعکس اینا بود باز یه کار دیگه. باز هم برای ; کافیه مثل بالا عمل کنی
کد پی‌اچ‌پی:
if( strpos$str';' ) ) {
echo( 
'noghte virgool dare' );
}
else {
echo( 
'nadare' ); 
غایب
  پاسخ
تشکر شده توسط :
#9
من تو یه برنامه ساده این متغیر های سراسری را چک کردم . بردمش تو تابه اصلا مقدارش رو چاپ نکرد . توی تابع هم مقدارش رو عوض کردم و بیرون استفاده کردم بازم مقدارش فرق نکرد . من در ادامه برنامه بسیار کار دارم با متغیر سراسری . دوستان وقتم تنگه من هر لحظه دارم اینجا رو چک می کنم کممممممممممممممممک

راستی این مهم نیست که نقطه ویرگول باشه این مهمه که کجا داره استفاده می شه . یعنی باید بعد از متغیر ها باشد مثلا . یا جلوی پرانتز if نباشد جلو آکولاد ها نباشد و . . . مثل یه کامپایلر .
  پاسخ
تشکر شده توسط :
#10
این دقیقا همون چیزیه که تو نیاز داری. بجای استفاده از این همه آرایه و کد ، با عبارات با قاعده راحت میشه به نتیجه دلخواه رسید.
کد پی‌اچ‌پی:
$str 'if(expression).';

if( 
strpos$str'.' ) ) {
        
$badchars = array( '\}','\{','\)','\(','\[','\]' );
        foreach( 
$badchars as $key => $value ) {
        if( 
preg_match"/$value\./",$str ) ) {
            
$newresult str_replace'\\'''$value );
            echo( 
'bade charactere <strong><u>' $newresult '</u></strong> nemishe' );
            break;
        }
}


کافیه $str تعویض بشه و قبل از نقطه اون کاراکتر های بد نباشن ! اونوقت همه چی true هست.
یا نه ، شاید میخوای کلاً ببینی کاراکتر های بد کجا استفاده شدن. اگر جاشون درست بود که اینطوری شه اگرم نبود اونطوری شه. کدوم یکی؟
غایب
  پاسخ
تشکر شده توسط : hfsa


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان