2015-03-30 118 views
6

因此,可以说,我有以下语法:如何解析子节点?

let_stat = "let" iden [ "=" expr ]; 
if_stat = "if" expr "->" stat; 
stat = let_stat | if_stat; 

这将是下面的伪代码杂交:

let_stat parseLetStat() { 


if token is "let" { 
     consume token 

     if token is identifier { 
      char *value = consumetoken.value 
      let_stat let = new let_stat; 
      let.name = value; 

      if token is "=" { 
       let.value = parseExpression; 
      } 

      return let 
     } 
    } 
} 

if_stat parseIfStat() { 
    if token is "if" { 
     consume token 

     expression expr = parseExpression; 
     block block = parseBlock; 

     if_stat ifstmt = new if_stat 
     ifstmt.expr = expr 
     ifstmt.block = block 
     return ifstmt 
    } 
} 

stat parseStatement() { 

} 

些什么呢parseStatement功能吗?它将如何选择调用哪个函数,if_stat函数或let_stat函数?或者我会把所有的代码放到一个函数中?我不太明白,任何帮助都会很好,因为我很困惑。

回答

1

您的特定问题的关键问题是,当EBNF规则发生变化时,非终结符的解析器必须调用所有替代方法,并询问它们是否识别构造;每个子分析器都必须返回一个表示是或否的标志。

你可能需要的是general principles for writing a recursive descent parser.

+0

哦,我明白了,完美。当然,从唯一的艾拉巴克斯特回答,你似乎回答了很多我的问题:)谢谢! :) – 2015-03-30 18:57:06

+0

@ user3839220:您在我的草坪上提问: - } – 2015-03-30 22:27:41