当前位置: 首页 > 知识库问答 >
问题:

ANTLR4孤岛溶液

徐文斌
2023-03-14

我想与您分享一个我必须在ANTLR4中实现的岛屿解决方案。

>

  • 语言的结构。我必须为其编写语法的语言是从PL/SQL派生出来的,带有一些附加的构造。我在这里不做更多的详细说明,因为这与主题无关。
  • 该语言定义了一个特殊的命令put,其结构如下:

    放[<专用语言>]

    我的解决办法是:

    public Token nextToken() {
        if (f_current_idx != -1) {
            _input.seek(f_current_idx); f_current_idx = -1;
        }
        Token l_token = super.nextToken(); return l_token;
    }
    
    PUT :
    'PUT'
    {
        f_current_idx = _input.index(); ((ANTLRStringStream) _input).rewind();
    
        SRC_PUTLexer l_put_lexer = new SRC_PUTLexer(_input);
        UnbufferedTokenStream<Token> l_tokenStream = new UnbufferedTokenStream<Token>(l_put_lexer);
    
        if (l_tokenStream.LA(2) == SRC_PUTLexer.LBRACK) { 
            new SRC_PUTParser(l_tokenStream).start_rule(); f_current_idx = _input.index();
        } 
    };
    
    public class ANTLRStringStream extends ANTLRInputStream {
    
        protected int markDepth = 0;
        protected int lastMarker;
    
        protected ArrayList<Integer> markers;
    
        public ANTLRStringStream() {
            super();
        }
    
        public ANTLRStringStream(String input) {
            super(input);
        }
    
        public int mark() {
            if ( markers==null ) { markers = new ArrayList<Integer>(); }
            markers.add(markDepth, index()); markDepth++; lastMarker = markDepth;
            return markDepth;
        }
    
        public void rewind(int m) {
            int state = (int) markers.get(m); seek(state); release(m);
        }
    
        public void rewind() { rewind(lastMarker); }
    
        public void release(int marker) {
            markDepth = marker; markDepth--;
        }
    }
    

    任何反馈都是非常欢迎的!问候,沃尔夫冈·哈默

  • 共有1个答案

    太叔繁
    2023-03-14

    这真的应该是一个社区维基。

    我的第一个主要评论是,您需要删除ANTLRStringStream类。ANTLR4提供的ANTLRInputStream类提供了ANTLR3中ANTLRStringStream的功能。IntStreamCharStream接口在ANTLR4中进行了修改和大量记录,以消除有问题的rewind方法和其他未定义的行为。你不应该再介绍他们。

     类似资料:
    • 问题内容: 谁能解释垃圾收集 隔离岛 的概念吗? 问题答案: 对象A引用对象B。对象B引用对象A。任何其他对象都没有引用对象A和对象B。那是一个孤立的孤岛。 基本上,隔离孤岛是一组相互引用的对象,但是应用程序中的任何活动对象都不会引用它们。严格来说,即使是单个未引用的对象也都是孤立的孤岛。 编辑评论:

    • 我正在使用Antrl4解析一种类似java的语言,在这种语言中,可以使用专有的查询语言在括号中编写表达式。假设在Java方法中,应该允许以下行: 但这会导致第一个括号字符上的令牌识别错误。 这种做法有什么问题吗?有人能指出我正在犯的错误吗?

    • 作为我的小语言示例问题的延续,我想问一下如何解析下面的文本。这次只是想跳过尾巴规则,但它是一个岛,对我来说并不明显。最好的,不那么陈腐的方法? 使用以下使用词法模式的语法: 使用不同顺序的lexer规则。也尝试了更多的词汇命令,但没有成功。

    • 问题内容: (PostgreSQL 8.4) 我对SQL的空白和孤岛做了很好的介绍,但是我仍然有一个问题。许多孤岛检测CTE基于时间戳的运行顺序和一些标志,这些标志在更改时会破坏序列。但是,如果“中断”条件稍微复杂些怎么办? 在这种情况下,表示设备,并且为或。我想选择的记录,,,并具有以下逻辑。 10转为OFF-正确结束序列,忽略行 11接通-确定,新序列,包括在SELECT中 11开启-重复,忽

    • 问题内容: 我必须使用此表: 期间 它列出了学生不必上学的所有时间段。不幸的是,有些时期是重叠的。当在学校放假期间周末或公共假期发生时(每个人都有自己的时段行),就会发生这种情况。 在查找具有休止日期范围的行的帮助下,并在具有联邦州的国家/地区中,累加了它们的持续时间,空缺和离校假期,我最终得到了以下查询: 我得到什么 结果是 前三行为0(标识678、534和679)。 我想要的是 但是id 9、

    • 问题内容: 我试图计算二维二进制矩阵中的孤岛数量(一组相连的1组成一个孤岛)。 例: 在上面的矩阵中,有5个岛,分别是: 为了计算2D矩阵中的孤岛数量,我假设矩阵为图,然后使用DFS类型的算法对孤岛进行计数。 我一直在跟踪DFS(递归函数)调用的数量,因为在Graph中有很多组件。 下面是我为此目的编写的代码: 我传入参数的矩阵输出错误。我知道了,但是有集群。 我尝试调试任何逻辑错误的代码。但是我