문제

다음 EBNF를 위해 PHP에서 재귀 적성 파서를 작성하려고 시도하고 있습니다 :

EXP ::= < TERM > { ( + | - ) < TERM > }
TERM ::= < FACTOR > { ( * | / ) < FACTOR > }
FACTOR ::= ( < EXP > ) | < DIGIT >
DIGIT ::= 0 | 1 | 2 | 3
.

가이드 유사한 질문에 권장 ...에 (내가 게시하기 전에 찾았습니다)

대부분의 경우 어떻게 작동하는지, 나는 문법을 이해합니다. 나는 문제가 내 구문 내에 있다고 생각한다. 나는 PHP에 새로운 것이므로 W3Schools 를 참조 해 왔습니다. 현재 코드로 다음 오류가 발생합니다.

Warning: Wrong parameter count for exp() .... on line 101
.

나는이 오류를 찾고 운이 많지 않았다. 잘못된 매개 변수를 통과하는 사람들에 대한 일부 게시물을 읽었 지 만 해당 함수에 대해 설정된 매개 변수가 없습니다. 여기에 누락 된 PHP에 대한 뭔가가 있습니까?

아래의 코드는, 나는 문법을위한 파스 트리에서 그것을 기반으로 한 이래로 논리가 정확하다고 생각합니다. $ 입력은 HTML 페이지의 양식 상자에서 오는 것입니다. 또한 PHP4가 내장되어 있지 않음을 발견했을 때 다른 게시물에서 STR_SPLIT 함수를 집어 들었습니다.

<html>
<body>
<?php 
if(!function_exists("exp")){
  function exp(){
    term();
    while($token == "+" | $token == "-"){
        if($token == "+"){
            match("+");
            term();
        }
        if($token == "-"){
            match("-");
            term();
        }
    }
  }//end exp
}

if(!function_exists("term")){
  function term(){
    factor();
    while($token == "*" | $token == "/"){
        if($token == "*"){
            match("*");
            factor();
        }
        if($token == "/"){
            match("/");
            factor();
        }
    }
  }//end term
}

if(!function_exists("factor")){
  function factor(){
    if($token == "("){
        match("(");
        exp();
        if($token == ")")
            match(")");
    }
    else if($token == 0|1|2|3){
         if($token == 0)
            match(0);
         if($token == 1)
            match(1);
         if($token == 2)
            match(2);
         if($token == 3)
            match(3);
    }
    else
        error();
  }//end factor
}

if(!function_exists("match")){
  function match($expected){
    if($token == $expected)
        nextToken();
    else
        error();
  }//end match
}

if(!function_exists("next_Token")){
  function nextToken(){
    $next++;
    $token = $tokenStr[$next];
    if($token == "$");
        legal();
  }
}

if(!function_exists("error")){
  function error(){
    echo "Illegal token stream, try again";
  }
}

if(!function_exists("legal")){
  function legal(){
    echo "Legal token stream, congrats!";
  }
}

if(!function_exists('str_split')) {
  function str_split($string, $split_length = 1) {
    $array = explode("\r\n", chunk_split($string, $split_length));
    array_pop($array);
    return $array;
  }
}

$tokenStr = str_split($input);
$next = 0;
$token = $tokenStr[0];
exp();
?>
</body>
</html>
.

그래서 기본적 으로이 구문자를 만드는 측면에서 오류와 이유와 이유를 알고 싶습니다.

나는 의견, 제안, 비판, 물의 baloons 및 토마토에 대해 감사드립니다. 내 게시물을 읽을 시간을 가져 주셔서 감사합니다. 좋은 하루 되세요 / 밤을 보내십시오.

도움이 되었습니까?

해결책

exp() 는 내장 된 PHP 기능입니다.그 이름으로 정의 할 수 없습니다.

일반 PHP 응용 프로그램에서 if(!function_exists(' 관용구를 사용할 이유가 없습니다.(종종 스크립트 충돌 또는 동일한 기능이 다른 위치에서 선언 된 경우에는 해결 방법으로 더 많이 사용됩니다.)


다른 구문 문제점은 비트 또는 이에 대해 사용하지 않는 문제입니다.논리적이거나 || 또는 or가 있어야합니다.

while($token == "*" | $token == "/"){
.

다른 팁

나는 야생 추측을 대답으로 바꿀 것입니다.그래서 문제가 거짓말을하는 곳은 아마도 무엇입니까?

http://php.net/manual/en/function.exp.php <./ a>

PHP가 이미 exp ()라는 함수가 있습니다.함수 이름을 어떻게 든 접두어 또는 이름 충돌을 피하기 위해 클래스를 사용하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top