我为支持函数调用而创建的简单语法遇到了麻烦。
我正在使用 Greg 的基于柠檬的 PHP_ParserGenerator。
这是语法的相关部分:
program ::= expr(A). { $this->result = A; }
value(A) ::= SIMPLE_STRING(B). { A = B; }
value(A) ::= NUMBER(B). { A = B; }
value(A) ::= CONTEXT_REFERENCE(B). { A = B; }
arg_list ::= arg_list SEPARATOR value(B). { $this->args[] = B; }
arg_list ::= value(B). { $this->args[] = B; }
arg_list ::= .
expr(A) ::= SIMPLE_STRING(B) PAREN_LEFT arg_list PAREN_RIGHT. { A = call_user_func_array(B, $this->args); }
expr(A) ::= CONTEXT_REFERENCE(B). {
list($context, $key) = explode('.', B);
A = $this->context[$context][$key];
}
当我使用上下文初始化解析器array('user' => array('name' => 'Dennis'));
并执行以下代码时:
$parser->doParse(PelParser::CONTEXT_REFERENCE, 'user.name');
$parser->doParse(0, 0);
$result
如下:“丹尼斯” 。生活很好。
但是当我提供一个 CONTEXT_REFERENCE 作为函数调用的参数时,它不起作用:
$parser->doParse(PelParser::SIMPLE_STRING, 'str_replace');
$parser->doParse(PelParser::PAREN_LEFT, '(');
$parser->doParse(PelParser::SIMPLE_STRING, 'e');
$parser->doParse(PelParser::SEPARATOR, ',');
$parser->doParse(PelParser::NUMBER, 3);
$parser->doParse(PelParser::SEPARATOR, ',');
$parser->doParse(PelParser::CONTEXT_REFERENCE, 'user.name');
$parser->doParse(PelParser::PAREN_RIGHT, ')');
$parser->doParse(0, 0);
这$result
是'us3r.nam3'。不太像预期的那样。作为记录,预期的输出当然是“D3nnis”。(user.name首先被字符串 'Dennis' 替换,然后传递给str_replace()
函数)。
我怀疑这与优先级有关。但我不知道我应该改变什么来做到这一点。非常稀疏的 Lemon 文档并没有太大的帮助。
任何帮助将不胜感激!谢谢