2010-05-25 80 views
2

我对C语言中的树语法antlr3有一些疑问。用C语言中的antlr3解析一些特定的语句

我几乎完成了我的解释器(函数,变量,布尔和数学表达式确定)和我一直为最终最困难的语句(如如,开关等)

1)我想解释一个简单的循环语句:

repeat: ^(REPEAT DIGIT stmt); 

我见过很多例子,但对树遍历(仅与宏MARK此主题()/快退(M)+ @Init/@After但不工作没有(我有antlr错误:“意外节点在偏移量0”))。我如何解释C中的这个陈述?

2)用一个简单的if语句同样的问题:

if: ^(IF condition stmt elseifstmt* elsestmt?); 

的问题是跳过语句,如果条件为假,并测试其他ELSEIF/else语句。

3)我有一些可以停止脚本的语句(如“break”或“exit”)。我如何打断树步行者并跳过以下标记?

4)当检测到词法分析器或分析器错误时,antlr返回一个错误。但我想制作我自己的错误消息。如何解析解析器崩溃的行号?

询问我是否需要更多详细信息。

非常感谢你(我为我的英文不好道歉)

+0

您是否找到该问题的答案? – greydet 2011-12-29 19:06:25

回答

0

关于重复的语句,我想我已经找到一种方法来做到这一点。在antlr.org中,我找到了一个C语言的完整解释器,但用Java编写。

我把这里while语句(有点不同,但方式是相同的):

whileStmt 
scope{ 
    Boolean breaked; 
} 
@after{ 
    CommonTree stmtNode=(CommonTree)$whileStmt.start.getChild(1); 
    CommonTree exprNode=(CommonTree)$whileStmt.start.getChild(0); 

    int test; 

    $whileStmt::breaked=false; 
    while($whileStmt::breaked==false){ 
      stream.push(stream.getNodeIndex(exprNode)); 
      test=expr().value; 
      stream.pop(); 
      if (test==0) break; 
      stream.push(stream.getNodeIndex(stmtNode)); 
      stmt(); 
      stream.pop(); 
     } 

} 
    : ^(WHILE . .) 
    ; 

我试图将此代码转换成C语言:

repeat 
scope { 
    int breaked; 
    int tours; 
} 
@after 
{ 
    int test; 

    pANTLR3_BASE_TREE repeatstmt = (pANTLR3_BASE_TREE)$repeat.start->getChild($repeat.start,1); 
    pANTLR3_BASE_TREE exprstmt = (pANTLR3_BASE_TREE)$repeat.start->getChild($repeat.start,0); 

    $repeat::breaked = 0; 
    test = 1; 

    while($repeat::breaked == 0) 
    { 
     TW_FOLLOWPUSH(exprstmt); 
     TW_FOLLOWPOP(); 
     test++; 
     if(test == $repeat::tours) 
      break; 
     TW_FOLLOWPUSH(repeatstmt); 
     CTX->repeat(CTX); 
     TW_FOLLOWPOP(); 
    } 
} 
    : ^(REPEAT DIGIT stmt) 
     {   
      $repeat::tours = $DIGIT.text->toInt32($DIGIT.text); 
     } 

但没有发生了(stmt被解析正确一次)。

您对此有什么想法吗?

关于自制错误消息,我在词法分析器中找到了宏GETLINE()。它适用于树漫步者崩溃但antlr继续为词法分析器错误或语法分析器错误显示错误消息。

谢谢。