繁体   English   中英

在C目标中使用antlr3解析一些特定的语句

[英]Parsing some particular statements with antlr3 in C target

我对C目标中带有树语法的antlr3有一些疑问。

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

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

repeat: ^(REPEAT DIGIT stmt);

我已经看到了很多示例,但没有关于树遍历器的任何信息(这里仅是带有宏MARK()/ REWIND(m)+ @init / @after的主题,但无法正常工作(我遇到了antlr错误:“偏移量为0的意外节点“))。 如何用C解释此语句?

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

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

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

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

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

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

非常感谢您(我为我的英语不好而道歉)

关于重复声明,我想我已经找到了一种方法。 在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继续显示有关词法分析器或解析器错误的错误消息时,它可以工作。

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM