PHP에서 EBNF를위한 재귀 적성 파서
-
12-11-2019 - |
문제
다음 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 == "/"){
. 다른 팁
나는 야생 추측을 대답으로 바꿀 것입니다.그래서 문제가 거짓말을하는 곳은 아마도 무엇입니까?
PHP가 이미 exp ()라는 함수가 있습니다.함수 이름을 어떻게 든 접두어 또는 이름 충돌을 피하기 위해 클래스를 사용하는 것이 좋습니다.