2011-07-25 38 views
0

我正在使用antlr创建DSL。 Lexer和Parser被写入一个语法文件(比如说layout.g)。树语法被写入另一个语法文件(比如layoutTree.g)。现在树解析器没有正确解析。我从解析器打印了AST输出,并且正确。我遍历了生成的树解析器代码,发现标记值声明在树解析器和解析器中分配了不同的值。下面是解析器和树解析器的输出示例。如何从antlr中的语法文件创建令牌文件

分析器输出

public static final int ARRAY_MEMBER_TOKEN=4; 
public static final int ARRAY_TOKEN=5; 
public static final int DECLARATION_TOKEN=6; 

树分析器输出

public static final int EOF=-1; 
public static final int DECLARATION_TOKEN=4; 
public static final int IDENTIFIER=5; 

正如你可以看到DECLARATION_TOKEN在解析器输出和树分析器输出不同的值。由于这个树解析器没有按预期工作,我该如何纠正这个问题?

生成的令牌文件(比如layout.token)是否存在问题?该文件在我的项目中为空。如何生成此文件?

+0

'.tokens'文件是在生成您的词法分析器/解析器时自动生成的。你的'.tokens'文件是空的这一事实并不好。你如何生成你的词法分析器? (命令行,IDE,ANTLRWorks,其他?) –

+0

我使用sourceforge.net的'antlrv3ide'。我从“http://antlrv3ide.sourceforge.net/updates”安装了它。我怎样才能使用命令行生成它? – hnm

+1

在命令行上,执行:'java -cp antlr-3.2.jar org.antlr.Tool layout.g'然后'java -cp antlr-3.2.jar org.antlr.Tool layoutTree.g' –

回答

0

你在树语法中有这样的东西吗?

options 
{ 
    tokenVocab=layout; //NOT layout.g or layout.tokens 
    ASTLabelType=pANTLR3_BASE_TREE; 
} 
+0

我有ASTLabelType = CommonTree;在我的解析器语法中。 – hnm

+0

对不起,我错过了tokenVocab = layout;在上面评论。我有选项 选项{ language = Java; tokenVocab = layout; ASTLabelType = CommonTree; }树语法 – hnm