左递归消除和epsilon处理的实现

问题描述

我有以下语法(上面和下面的其他规则已消除):

expression = (expression,("+" | "-"),term) | term ;
term = (term,("*" | "/" | "%"),factor) | factor ;
factor = name | constant | "(",expression,")" ;

通常将其重写为以下内容,以消除左递归:

expression = term,expression' ;
expression' = (("+" | "-"),term,expression') | ε ;

term = factor,term' ;
term' = (("*" | "/" | "%"),term')) | ε;
...

现在,我有以下C ++代码,是上述代码的实现。 RDParser包含一个全局变量,它是当前令牌的索引,doesConsumingmatch()返回true并在令牌匹配时推进索引,变量的向量是更新某些数据库。 / p>

bool RDParser::expression(std::vector<Token>& variables)
{
    return term(variables) && expressionPrime(variables);
}

bool RDParser::expressionPrime(std::vector<Token>& variables)
{
    return (doesConsumingMatch(Terminal::PLUS) || doesConsumingMatch(Terminal::MINUS)) 
&& term && expressionPrime(variables); // epsilon?
}

bool RDParser::term(std::vector<Token>& variables)
{
    return factor(variables) && termPrime(variables);
}

bool RDParser::termPrime(std::vector<Token>& variables)
{
    return (doesConsumingMatch(Terminal::TIMES)
            || doesConsumingMatch(Terminal::DIVIDE)
            || doesConsumingMatch(Terminal::MODULO)) && factor(variables) && termPrime(variables); //epsilon?
}

现在,这是否和左递归版本一样无限递归?我的想法是让函数解析给定的表达式并通过仅展开递归和调用堆栈来返回true。还有一个epsilon问题:在此实现中,如果表达式在输入令牌的向量的末尾,则程序包含错误,我们可以简单地停止解析。

因此,我该如何解决上述四种方法以允许像1 + 2 + 3 * 4(1 + 2) + (3 * 4)这样的左联想表达式?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)