我编写了一个 ANTLR3 语法,该语法细分为更小的规则以提高可读性。
例如:
messageSequenceChart:
'msc' mscHead bmsc 'endmsc' end
;
# Where mscHead is a shortcut to :
mscHead:
mscName mscParameterDecl? timeOffset? end
mscInstInterface? mscGateInterface
;
我知道内置的 ANTLR AST 构建功能允许用户声明不会出现在最终 AST 中的中间 AST 节点。但是如果您手动构建 AST 会怎样?
messageSequenceChart returns [msc::MessageSequenceChart* n = 0]:
'msc' mscHead bmsc'endmsc' end
{
$n = new msc::MessageSequenceChart(/* mscHead subrules accessors like $mscHead.mscName.n ? */
$bmsc.n);
}
;
mscHead:
mscName mscParameterDecl? timeOffset? end
;
文档中没有谈论这样的事情。因此,看起来我必须为每个中间规则创建节点才能访问其子规则结果。
有谁知道更好的解决方案?
谢谢。
您可以通过让子规则返回多个值并仅访问您感兴趣的值来解决此问题。
以下演示展示了如何操作。尽管它不是用 C 语言编写的,但我相信您能够对其进行调整,使其满足您的需求:
grammar Test;
parse
: sub EOF {System.out.printf("second=\%s\n", $sub.second);}
;
sub returns [String first, String second, String third]
: a=INT b=INT c=INT
{
$first = $a.text;
$second = $b.text;
$third = $c.text;
}
;
INT
: '0'..'9'+
;
SPACE
: ' ' {$channel=HIDDEN;}
;
如果你解析输入"12 34 56"
使用生成的解析器,second=34
打印到控制台,运行后可以看到:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
TestLexer lex = new TestLexer(new ANTLRStringStream("12 34 56"));
TokenStream tokens = new TokenRewriteStream(lex);
TestParser parser = new TestParser(tokens);
parser.parse();
}
}
因此,从parse
规则就像$sub.INT
, or $sub.$a
访问三个之一INT
代币,在not不幸的是,有可能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)