2

我有一些关于 C 目标中树语法的 antlr3 的问题。

我几乎完成了我的解释器(函数、变量、布尔和数学表达式还可以),并且我保留了最困难的语句(如 if、switch 等)

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

repeat: ^(REPEAT DIGIT stmt);

我看过很多例子,但没有关于 tree walker 的例子(这里只有一个带有宏 MARK() / REWIND(m) + @init / @after 但不起作用的主题(我有 antlr 错误:“偏移量为 0 的意外节点“))。我如何用 C 解释这个语句?

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

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

问题是如果条件为假则跳过该语句并测试其他 elseif/else 语句。

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

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

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

非常感谢你(我为我糟糕的英语道歉)

4

1 回答 1

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()。它在 tree walker 崩溃但 antlr 继续显示 lexer 或 parser 错误的错误消息时工作。

谢谢。

于 2010-05-27T09:09:22.417 回答