【问题标题】:PHP_ParserGenerator - bug in grammar or in the parser generator?PHP_ParserGenerator - 语法或解析器生成器中的错误?
【发布时间】:2010-01-12 08:16:13
【问题描述】:

我正在尝试使用lemon port to PHP 为一种简单的语言创建一个解析器,它几乎可以工作。

以下语法:

%name SP_
%declare_class { class SpecParser }
%token_prefix SP_
%include_class {
 public $retvalue = '<todo: error handling>';
 public function singleKey($elem) {
     end($elem);
     return key($elem);
 }
}
%parse_accept {
 $this->retvalue = $this->_retvalue;
}

%right ASSIGN.

start(A) ::= spec(B) . { A = B; }

spec(A) ::= top_stmt(B) . { A = B; }

top_stmt(A) ::= . { A=array('empty' => NULL); }
top_stmt(A) ::= conditional(B) . { A = B;}
top_stmt(A) ::= retval(B) . { A = B; }
top_stmt(A) ::= assignment(B) . { A = array('assignment' => B); }
top_stmt(A) ::= MOD STRING(B) top_stmt(C) . {C['rulename'] = B; A=B;}

conditional(A) ::= IF stmt_list(B) . { A = array('condbreak' => array('stmt_list' => B)); }
conditional(A) ::= IF stmt_list(B) stmt(C) . { A = array('condexec' => array('cond' => B,'exec' => C)); }

retval(A) ::= access(B) . { A = array('access' => B); }
retval(A) ::= invoke(B) . { A = array('invoke' => B); }

assignment(A) ::= access(B) ASSIGN expr(C) . {A = array('lval' => B, 'rval' => C);}

expr(A) ::= retval(B) . { A = array('retval' => B); }
expr(A) ::= NOT retval(B) . { A = array('!retval' => B); }

stmt(A) ::= expr(B) . { A = array('expr' => B); }
stmt(A) ::= assignment(B) . { A = array('assignment' => B); }

empty_stmt_list(A) ::= . {A = array();}
empty_stmt_list(A) ::= stmt(B) . {
    A = array(B);
}
empty_stmt_list(A) ::= empty_stmt_list(B) COMMA stmt(C) . {
    B[] = C;
    A = B;
}

stmt_list(A) ::= stmt_list(B) COMMA stmt(C) . {B[] = C; A=B; }
stmt_list(A) ::= stmt(B) . { A = array(B); }

invoke(A) ::= access(B) LPAREN empty_stmt_list(C) RPAREN . { A = array('target' => B,'args' => C); }

access(A) ::= VARIABLE(B) . { A = array('variable' => B); }

应该像这样解析输入:

  1. '如果 $cond1,!$cond2,$cond3() $var = $this($a(),$inst1 = $b())'
  2. '$var'
  3. '%rulename $var'

虽然像 1 和 2 这样的输入按预期工作,但不知何故,我无法理解如何输入 3 返回 string(8) "rulename"。我不知道应该进行哪些削减才能实现这一目标。是语法有问题,还是我应该开始调试 PHP_ParserGenerator 本身?

谢谢

【问题讨论】:

    标签: php parsing grammar


    【解决方案1】:

    我一定很累。错误是错误的分配:

    top_stmt(A) ::= MOD STRING(B) top_stmt(C) . {C['rulename'] = B; A=B;}
    

    应该是:

    top_stmt(A) ::= MOD STRING(B) top_stmt(C) . {C['rulename'] = B; A=C;}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多