[英]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.