首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java反编译ANTLR

从Java反编译ANTLR
EN

Stack Overflow用户
提问于 2013-01-26 06:17:15
回答 1查看 534关注 0票数 2

我有.java文件中的解析器和ANTLR3的词法分析器的Java源代码,并希望看到所有规则等实际的语法背后。

这有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-26 06:31:50

而不是通过一些自动化工具(AFAIK)。但是生成的源文件在其注释中包含原始语法的解析器和词法分析器规则,因此您可以很容易地对它们进行逆向工程。

例如,以这个虚拟语法为例:

代码语言:javascript
复制
grammar T;

parse
 : foo
 | bar
 | OTHER
 ;

foo : INT ;
bar : ALPHA ;

INT   : '0'..'9'+ ;
ALPHA : ('a'..'z' | 'A'..'Z')+ ;
OTHER : . ;

如果从它生成一个词法分析器和解析器,解析器将如下所示:

代码语言:javascript
复制
public class TParser extends Parser {

    // $ANTLR start "parse"
    // T.g:3:1: parse : ( foo | bar | OTHER );
    public final void parse() throws RecognitionException {
        ...
    }
    // $ANTLR end "parse"

    // $ANTLR start "foo"
    // T.g:9:1: foo : INT ;
    public final void foo() throws RecognitionException {
        ...
    }
    // $ANTLR end "foo"


    // $ANTLR start "bar"
    // T.g:10:1: bar : ALPHA ;
    public final void bar() throws RecognitionException {
        ...
    }
    // $ANTLR end "bar"
}

lexer如下所示:

代码语言:javascript
复制
public class TLexer extends Lexer {

    // $ANTLR start "INT"
    public final void mINT() throws RecognitionException {
        // T.g:12:7: ( ( '0' .. '9' )+ )
        ...
    }
    // $ANTLR end "INT"

    // $ANTLR start "ALPHA"
    public final void mALPHA() throws RecognitionException {
        // T.g:13:7: ( ( 'a' .. 'z' | 'A' .. 'Z' )+ )
        ...
    }
    // $ANTLR end "ALPHA"

    // $ANTLR start "OTHER"
    public final void mOTHER() throws RecognitionException {
        // T.g:14:7: ( . )
        ...
    }
    // $ANTLR end "OTHER"
}

如您所见,所有语法规则都包含在.java源文件的注释中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14531230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档