我有这个语法:
program ::= expr_list
expr_list ::= {LF} [expr {LF {LF} expr}] {LF}
lvalue ::= [expr DOT] NAME
call_param ::= [[NAME COLON] expr {COMMA [NAME COLON] expr}]
func_param ::= [NAME [COLON expr] {COMMA NAME [COLON expr]}]
expr ::= lvalue
| lvalue ASSIGN expr
| expr OPAREN call_param CPAREN
| FUNC func_param LF expr_list END
| IF expr LF expr_list {ELSEIF expr LF expr_list} [ELSE expr_list] ENDIF
| WHILE expr LF expr_list LOOP
| DO expr_list LOOP WHILE expr LF
| INTEGER
我部分写了一个递归下降解析器:
void Parser::ntProgram()
{
ntExprList();
}
void Parser::ntExprList()
{
// ???
}
void Parser::ntLvalue()
{
// ???
}
void Parser::ntCallParam()
{
// ???
}
void Parser::ntFuncParam()
{
if (accept(Lexer::NameTok)) {
if (accept(Lexer::ColonTok)) {
ntExpr();
}
}
while (accept(Lexer::CommaTok)) {
expect(Lexer::NameTok);
if (accept(Lexer::ColonTok)) {
ntExpr();
}
}
}
void Parser::ntExpr()
{
if (accept(Lexer::FuncTok))
{
ntFuncParam();
expect(Lexer::LfTok);
ntExprList();
expect(Lexer::EndTok);
}
else if (accept(Lexer::WhileTok))
{
ntExpr();
expect(Lexer::LfTok);
ntExprList();
expect(Lexer::LoopTok);
}
else if (accept(Lexer::DoTok))
{
ntExprList();
expect(Lexer::WhileTok);
expect(Lexer::LoopTok);
ntExpr();
expect(Lexer::LfTok);
}
else if (accept(Lexer::IfTok))
{
ntExpr();
expect(Lexer::LfTok);
ntExprList();
while (accept(Lexer::ElseifTok))
{
ntExpr();
expect(Lexer::LfTok);
ntExprList();
}
if (accept(Lexer::ElseTok))
{
ntExprList();
}
expect(Lexer::EndifTok);
}
else if (accept(Lexer::IntegerTok))
{
}
}
但我不知道在某些部分该做什么,例如expr可以是左值的方式,其第一项可能是expr。
答案 0 :(得分:1)
为了能够解析expr规则,你必须先消除左递归。这在维基百科上有很好的解释: